2012-11-05 32 views
0

我需要在DIR檢查有這種格式的150.000 zip文件:Shell腳本的mkdir如果不和MV文件每一天

log_from_2012_08_14-11:57:12_To_2012_08_14-13:57:12.zip 
log_from_2012_08_14-13:57:12_To_2012_08_14-15:57:12.zip 
log_from_2012_08_14-15:57:12_To_2012_08_14-17:57:12.zip 

如果沒有與名稱的目錄等於該

2012_08_14 

然後移動從From_2012_08_14該目錄中存在的所有文件,如果沒有創建它

(MKDIR日期+%Y_%M_%d:文件的一天)

然後檢查自八月以來的每一天,直到今天十一月,從一天開始的每個文件都有自己的目錄創建它並將它移動到那裏。

+1

因此,如果一個文件涵蓋'2012_08-14-23:57:12_To_2012_08_15-01:57:12',它會放在'from'日期的文件夾中,而不是'to'日期? –

+0

150,000個文件;每兩小時一個文件;這是很多天(12,500天左右,或30多年)。你有什麼其他的文件名格式? –

回答

1
cd /relevant/log/directory 

# Create the necessary sub-directories 
ls *from_????_??_??-??:??:??_To_????_??_??-??:??:??.zip | 
sed 's/.*from_\([0-9]\{4\}_[0-9][0-9]_[0-9][0-9]\).*/\1/' | 
sort -u | 
xargs mkdir -p 

# Move the files into the sub-directories 
ls *from_????_??_??-??:??:??_To_????_??_??-??:??:??.zip | 
sed 's/.*from_\([0-9]\{4\}_[0-9][0-9]_[0-9][0-9]\).*/mv & \1;/' | 
sh -x 

-x是可選的,但會告訴您正在發生的事情。我假設你的文件名都不包含空格或換行符。我還假設沒有帶有字母數字的文件,其中shell模式中的?預期與數字匹配。您可以展開每個?[0-9]如果你要完全偏執,或修改sed腳本丟棄不匹配的姓名等

0

快速和骯髒的解決方案猛砸

for file in log_from*.zip; do 
    dirname=${file#log_from_} 
    dirname=${dirname%%-*} 
    [ ! -d "$dirname" ] && mkdir "$dirname" 
    mv "$file" "$dirname" 
done 
+0

嗯我得到一個錯誤的不能mv「log_from * .zip」到itstel的子目錄, – drd0sPy