【问题标题】:How to delete X number of files in a directory如何删除目录中的X个文件
【发布时间】:2016-06-07 12:51:11
【问题描述】:

要在一个目录中获取 X 个文件,我可以这样做:

$ ls -U | head -40000

然后我将如何删除这 40,000 个文件?例如,类似:

$ "rm -rf" (ls -U | head -40000)

【问题讨论】:

  • 请注意,在此示例中,ls-U 选项将返回未排序的目录内容(因为它们是“本地”存储的)。它也不会显示点文件。您可能需要其他选项,具体取决于您的需要。
  • 希望你的文件名中没有换行符,使用第一个命令。

标签: linux unix


【解决方案1】:

您需要的工具是xargs。它将标准输入转换为您指定的命令的参数。输入的每一行都被视为一个参数。

因此,这样的事情会起作用(但请参阅下面的评论,ls 不应正常解析):

ls -U | head -40000 | xargs rm -rf

我建议在尝试此操作之前先使用较小的 head 大小并使用 xargs echo 打印出正在传递的文件名,以便您了解要删除的内容。

请注意,如果您的文件包含奇怪的字符,这有时会成为问题。如果您在现代 GNU 系统上,您可能还希望使用这些命令的参数,这些命令使用空字符来分隔每个元素。由于文件名不能包含可以安全解析所有可能名称的空字符。我不知道有一种简单的方法可以在 X 以零分隔时获取顶部的项目。

因此,例如,您可以使用它来删除目录中的所有文件

find . -maxdepth 1 -print0 | xargs -0 rm -rf

【讨论】:

  • Parsing ls 是一种反模式,在任何自动化中都应避免使用。 (我意识到这是在问题中,但读者可能会直接跳到答案。)
  • 是的。在我使用 ls 之前更新了答案以发出警告
【解决方案2】:

使用 bash 数组并对其进行切片。如果参数的数量和大小可能接近系统的限制,您仍然可以使用xargs 来拆分剩余部分。

files=( * )
printf '%s\0' "${files[@]:0:40000}" | xargs -0 rm

【讨论】:

  • 您是否使用 40.000 个任意长度的文件名进行了测试?你认为rm 可以消耗 40.000 个参数吗?
  • @hek2mgl 没有。如何生成任意长度的名称?更严重的是,我可以测试它,它可以在这里工作,因为我有一个特定的 exec 实现,并且对于可能有不同的 OP,它仍然可能失败。在 OS X 上,ARG_MAX 约为 264k。
  • 不,这 (a) 不起作用,并且 (b) 即使它可以在未来的系统上运行,它也永远无法扩展。我不想成为聪明的驴子,但这就是事实。顺便说一句,我应该简单地使用“最大”而不是上面的“任意”长度。
  • @hek2mgl 在什么意义上它不会扩展?
  • 我的意思是 shell 变量的容量有限。命令行的最大长度也是有限的。即使即将推出的操作系统增加了这个限制,它也会受到限制。结论:您不能将其存储在 bash 变量中,也不能只调用一次 rm 。 (我的意思是可靠)。您需要根据需要多次调用它来处理所有参数,始终传递允许不达到字符限制的可能参数数量。实际上这是xargs 正在做的;)
【解决方案3】:

使用awk 作为过滤器怎么样?

find "$FOLDER" -maxdepth 1 -mindepth 1 -print0 \
    | awk -v limit=40000 'NR<=limit;NR>limit{exit}' RS="\0" ORS="\0" \
    | xargs -0 rm -rf

它可以可靠地删除最多 40.000 个文件(或文件夹)。可靠意味着无论文件名可能包含哪些字符。


顺便说一句,要可靠地获取目录中的文件数,您可以这样做:

find FOLDER -mindepth 1 -maxdepth 1 -printf '.' | wc -c 

【讨论】:

    【解决方案4】:

    我最终这样做了,因为我的文件夹是用序号命名的。这也适用于按字母顺序排列的文件夹:

    ls -r releases/ | sed '1,3d' | xargs -I {} rm -rf releases/{}
    

    详情:

    • 倒序列出releases/文件夹中的所有项目
    • 切掉前 3 个项目(如果是数字/字母命名,这将是最新的)
    • 对于每个项目,rmit

    在您的情况下,您可以将ls -r 替换为ls -U,并将1,3d 替换为1,40000d。我相信那应该是一样的。

    【讨论】:

    • 这行得通,但不是删除 3 个文件,而是只留下 3 个文件。
    猜你喜欢
    • 2021-09-11
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2020-02-22
    • 2016-04-29
    相关资源
    最近更新 更多