簡體   English   中英

Find命令中的Linux LS -T輸出

[英]Linux LS -T output in Find command

我已經准備了一個帶有ls -t的腳本來獲取最新文件,並與我在下面使用的重復項進行比較

ls -t *xml |awk 'BEGIN{FS="_"}{if (++dup[$1] >= 2) print}'

但是對於大尺寸文件夾ls命令不起作用。 所以我嘗試了

find ./ -type f \( -iname "*.xml" \) | sort |awk 'BEGIN{FS="_"}{if (++dup[$1] >= 2) print}'

但是不會先提取新創建的文件,因此我無法保留新創建的文件。

我需要以類似的方式更改find​​命令輸出ls -t命令。

如果您的文件保證名稱中沒有換行符,請嘗試:

find . -type f -printf '%T@ %p\n' | sort -rg | sed -E 's/[^ ]* //' | awk -F_ '{if (++dup[$1] >= 2) print}'

對於接受所有文件名的更強大的解決方案,請嘗試(需要GNU工具):

find . -type f -printf '%T@ %p\0' | sort -rgz | sed -Ez 's/[^ ]* //' | awk -v RS="\0" -F_ '{if (++dup[$1] >= 2) print}'

這個怎么運作

所以我們有一個例子,讓我們創建三個文件:

$ touch b_1
$ touch b_2
$ touch b_3

我們使用find打印文件的時間戳,后跟文件名:

$ find . -type f -printf '%T@ %p\n'
1511234577.7454717760 ./b_3
1511234574.9814419470 ./b_1
1511234576.1054540780 ./b_2

我們希望文件按時間戳排序,最新文件排在第一位,因此我們使用sort -rg對時間戳進行數字反向排序(表示為自紀元以來的秒數):

$ find . -type f -printf '%T@ %p\n' | sort -rg
1511234577.7454717760 ./b_3
1511234576.1054540780 ./b_2
1511234574.9814419470 ./b_1

下一步是擺脫時間戳。 所以,我們使用sed:

$ find . -type f -printf '%T@ %p\n' | sort -rg | sed -E 's/[^ ]* //'
./b_3
./b_2
./b_1

現在,我們可以使用您的awk腳本來識別舊文件:

$ find . -type f -printf '%T@ %p\n' | sort -rg | sed -E 's/[^ ]* //' | awk -F_ '{if (++dup[$1] >= 2) print}'
./b_2
./b_1

兼容性

很老的GNU系統不支持sed的-E選項。 在這樣的系統上,可以用-r替換-E ,如:

sed -r 's/[^ ]* //'

或者,對於更強大的版本:

sed -rz 's/[^ ]* //'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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