【问题标题】:Linux LS -T output in Find command查找命令中的 Linux LS -T 输出
【发布时间】:2018-05-04 09:55:15
【问题描述】:

我已经准备了一个带有 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 命令输出的方式更改 find 命令。

【问题讨论】:

  • Stackoverflow 成功的原因之一是它严格遵守标准格式。在标准格式中,要将问题标记为已解决,接受最佳答案(寻找绿色复选标记)。更多关于 SO 看似奇特的习俗,请参阅What should I do when someone answers my question?

标签: linux unix duplicates find ls


【解决方案1】:

如果保证您的文件名称中没有换行符,请尝试:

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/[^ ]* //'

【讨论】:

  • 谢谢,但 sed 命令对我不起作用。 sed: 无效选项 -- E
  • @misterbean2 您使用的是旧的 RedHat 系统吗?将-E 替换为-r,例如sed -r 's/[^ ]* //',或者更强大的版本sed -rz 's/[^ ]* //'
  • sed -r 与相同的参数完美配合。非常感谢
  • @misterbean2 我很好奇:你使用的是什么 Linux 发行版/版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2013-10-23
相关资源
最近更新 更多