[英]Sorting similar files according to a field in the filename and delete the old one
我需要您的幫助。 我的問題是我想根據文件名中的字段對目錄中的文件進行排序,然后刪除舊文件。
例如; 我在目錄中有兩個文件,如下所示:
創建日期文件名
Jan 10 15:56 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180109.txt
Jan 10 16:40 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180110.txt
我需要用"_"
字符分隔文件名,並按兩個ID字段("1-IKRF2YZ_1-IKRF2YX")
對文件進行排序,然后刪除/移動較舊的文件。
您能幫我在Shell腳本中找到解決方案嗎?
提前致謝
要獲取按鍵(在文件名中)和文件修改時間排序的文件列表( %C@
獲取修改時間, %f
獲取文件名;將它們更改為所需的內容):
$> find directory -printf '%C@ %f\n' | \
sed -n -r '/_.*_/{s:^([^_]*)_(.*)_(.*)$:\2 \1_\2_\3:;p}' | \
sort
1-IKRF2YZ_1-IKRF2YX 1516178476.1838399230 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180110.txt
1-IKRF2YZ_1-IKRF2YX 1516178479.7838400320 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180109.txt
1-IKRF2YZ_1-IKRF2YX 1516178501.4338406770 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180111.txt
要從列表中按鍵獲取UNIQUE文件列表(請注意:“ unique” =僅獲取第一個文件,因此我們需要顛倒順序):
$> find directory -printf '%C@ %f\n' | \
sed -n -r '/_.*_/{s:^([^_]*)_(.*)_(.*)$:\2 \1_\2_\3:;p}' | \
sort -r | \
sort -k1,1 -u
1-IKRF2YZ_1-IKRF2YX 1516178501.4338406770 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180111.txt
現在,您可以將那些選定的文件移動到另一個目錄:
$> find directory -printf '%C@ %f\n' | \
sed -n -r '/_.*_/{s:^([^_]*)_(.*)_(.*)$:\2 \1_\2_\3:;p}' | \
sort -r | \
sort -k1,1 -u | \
sed -r 's:^([^ ]+) ([^ ]+) (.*+)$:mv \"\3\" to-another-dir\/.:'
mv "FileFormat_1-IKRF2YZ_1-IKRF2YX_20180111.txt" to-another-dir/.
這樣,您可以將每個密鑰的所有最新文件(即唯一文件)移動到另一個目錄; 然后,可以根據需要刪除剩下的那些文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.