如何删除目录中的X个文件

时间:2016-02-24 23:51:11

标签: linux unix

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

$ ls -U | head -40000

我如何删除这些40,000个文件?例如,像:

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

4 个答案:

答案 0 :(得分:3)

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

因此,这样的事情会起作用(参见下面的评论,但ls通常不会以这种方式解析):

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

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

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

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

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

答案 1 :(得分:2)

使用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 

答案 2 :(得分:2)

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

xargs

答案 3 :(得分:0)

由于我的文件夹是按顺序编号命名的,所以我最终还是这样做了。这也适用于字母文件夹:

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

详细信息:

  • 以相反的顺序列出releases/文件夹中的所有项目
  • 将前3项剔除(如果是数字/字母命名,则将是最新的)
  • 为每个项目rm

根据您的情况,可以将ls -r替换为ls -U,将1,3d替换为1,40000d。我相信那应该是相同的。