要获取目录中的X个文件,我可以这样做:
$ ls -U | head -40000
我如何删除这些40,000个文件?例如,像:
$ "rm -rf" (ls -U | head -40000)
答案 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/
文件夹中的所有项目rm
根据您的情况,可以将ls -r
替换为ls -U
,将1,3d
替换为1,40000d
。我相信那应该是相同的。