我准备了一个带有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}'
但是先不提取新创建的文件,因此我无法保留新创建的文件。
我需要以类似的方式更改ls -t命令的输出命令。
答案 0 :(得分:3)
如果您的文件保证名称中没有换行符,请尝试:
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
选项。在此类系统上,可以将-E
替换为-r
,例如:
sed -r 's/[^ ]* //'
或者,对于更强大的版本:
sed -rz 's/[^ ]* //'