簡體   English   中英

根據文件名中的字段對相似文件進行排序,然后刪除舊文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM