【问题标题】:Recursively delete all but the one newest file throughout all directories递归删除所有目录中除一个最新文件之外的所有文件
【发布时间】:2021-01-03 03:20:36
【问题描述】:

我的系统依赖于每个子目录只有一个文件(PDF、DOCX)。 有成千上万的子目录。 由于权限错误,在其中一些文件中,我得到了多个文件。 在这些情况下,我只想保留一个最近修改的文件。

我能够成功导出包含多个文件的目录列表:

find . -type f -printf '%h\n' | sort | uniq -d >test.txt

所以我最终得到了一个很好的列表,列出了我需要查看的所有目录。不过比较长。

我还能够自动删除目录中除最近修改的文件之外的所有内容:

ls -t | tail -n +2 | xargs -d '\n' rm -f

这确实会删除除最近修改的文件之外的所有文件。

我遇到的问题是第二个命令仅在该目录中有效。我还没有想出一种将它递归应用到所有目录的方法。

我已经尝试过:

find /data/test/CONTAINER/SANDBOX -type f -exec sh -c 'ls -t | tail -n +2 | xargs -d '\n' rm -f ' {} \;

但这只是产生了 xargs: argument line too long

我已尝试调整 xargs 参数,但我确定必须有更好的方法来执行此操作?也许是一个 shell 脚本,将文件夹的 test.txt 文件通过管道传输到 cd 中,然后在每个文件夹中执行命令二?或者只是一种将命令 2 递归应用于所有子文件夹的方法,而不管该文件夹中包含多少文件?

我想到的最后一件事是,也许我尝试过的命令 3 适用于我有数十万个目录的主目录,难怪参数行可能太长 - 但 -mindepth 2 没有改变一件事。

谢谢

【问题讨论】:

  • 我认为您需要重新考虑您的整个方法 - 如果您的任何子目录中的文件少于 3 个,您就会遇到问题。您要尝试执行的操作类似于find -type d -exec sh -c 'cd "{}";pwd; ls -t | tail -n +2|xargs rm ' \; ...但正如我所说...不可靠。

标签: linux shell fs


【解决方案1】:

我认为以下脚本应该可以解决问题。

#!/bin/bash

DIR_TO_FIND="/path/to/dir"

find "$DIR_TO_FIND" -type d | while read -r DIR; do
    cd "$DIR"
    ls -t | tail -n +2 | xargs -d '\n' rm -f
    cd "$DIR_TO_FIND" 
done

【讨论】:

  • 谢谢 - 就像一个魅力。即使脚本需要放在它自己的目录中,否则脚本会删除它自己的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2019-11-21
  • 2019-12-04
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多