由於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
和.csv
和zip
對應的結束他們在存檔在日期:追加這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
:)
是否必須在bash? –
你試過'男人拉鍊嗎?我確定有一種方法可以爲要包含的文件指定文件模式。 –
爲什麼一行命令? – tripleee