2014-05-02 76 views
-1

相同的字符串如何寫簡單的shell腳本來創建壓縮文件中的文件。
我想從一個文件夾收集在它們的文件名與相同字符串模式文件來創建壓縮文件。如何編寫shell腳本來創建壓縮文件爲曾在文件名

例如,文件夾下可能有很多文件。

  • xxxxx_20140502_xxx.txt
  • xxxxx_20140502_xxx.txt
  • xxxxx_20140503_xxx.txt
  • xxxxx_20140503_xxx.txt
  • xxxxx_20140504_xxx.txt
  • xxxxx_20140504_xxx.txt

運行shell腳本後,結果必須是三個zip文件。

  • 20140502.zip
  • 20140503.zip
  • 20140504.zip

請給我正確的方向,以創建簡單的shell腳本輸出的結果如上。

+0

是否必須在bash? –

+0

你試過'男人拉鍊嗎?我確定有一種方法可以爲要包含的文件指定文件模式。 –

+3

爲什麼一行命令? – tripleee

回答

1
#!/bin/bash 

for file in *_????????_*.csv *_????????_*.txt; do 
     [ -f "${file}" ] || continue 
     date=${file#*_} # adjust this and next line depending 
     date=${date%_*} # on your actual prefix/suffix 
     echo "${date}" 
done | sort -u | while read date; do 
     zip "${date}.zip" *${date}* 
done 
+0

謝謝,它的工作原理。 – tinlinnsoe

0
#! /bin/bash 
dates=$(ls ?????_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_???.{csv,txt} \ 
    | cut -f2 -d_ | sort -u) 

for date in $dates ; do 
    zip $date.zip ?????_"$date"_???.{csv,txt} 
done 
1

由於zip將更新存檔,這會做:

shopt -s nullglob 
for file in *.{txt,csv}; do [[ $file =~ _([[:digit:]]{8})_ ]] && zip "${BASH_REMATCH[1]}.zip" "$file"; done 

shopt -s nullglob是因爲你不希望有未展開的水珠,如果沒有匹配的文件。


一切都在此線下面是我的老答案...

首先,獲得所有可能的日期。啓發式,這可能是在.txt.csv結尾的文件匹配正則表達式_[[:digit:]]{8}_說:

#!/bin/bash 
shopt -s nullglob 
declare -A dates=() 
for file in *.{csv,txt}; do 
    [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]= 
done 
printf "Date found: %s\n" "${!dates[@]}" 

這將輸出到標準輸出的文件中找到的所有日期。例如。(我叫上一剪斷gorilla和我chmod +x gorilla和感動的演示幾個文件):

$ ls 
banana_20010101_gorilla.csv gorilla_20140502_bonobo.csv 
gorilla      notthisone_123_lol.txt 
gorilla_20140502_banana.txt 
$ ./gorilla 
Date found: 20140502 
Date found: 20010101 

下一步,對於每個日期,讓所有的文件.txt.csvzip對應的結束他們在存檔在日期:追加這gorilla將做的工作:

for date in "${!dates[@]}"; do 
    zip "$date.zip" *"_${date}_"*.{csv,txt} 
done 

全部腳本中刪除部分水浸後:

#!/bin/bash 
shopt -s nullglob 
declare -A dates=() 
for file in *.{csv,txt}; do 
    [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]= 
done 
for date in "${!dates[@]}"; do 
    zip "$date.zip" *"_${date}_"*.{csv,txt} 
done 

編輯。我忽略了你的要求和一行命令。然後這裏是一個班輪:

shopt -s nullglob; declare -A dates=(); for file in *.{csv,txt}; do [[ $file =~ _([[:digit:]]{8})_ ]] && dates[${BASH_REMATCH[1]}]=; done; for date in "${!dates[@]}"; do zip "$date.zip" *"_${date}_"*.{csv,txt}; done 

:)

+1

+1,非常詳盡的答案...但是您應該添加一個免責聲明,這是'bash4 +',僅僅是由於使用了一個關聯數組。 –

相關問題