我在UNIX的一个目录下有几百个PDF。PDF的名称非常长(约60个字符)。

当我尝试使用以下命令一起删除所有PDF时:

rm -f *.pdf

我收到以下错误:

/bin/rm: cannot execute [Argument list too long]

此错误的解决方案是什么?mv和cp命令是否也会出现此错误?如果是,如何解决这些命令?


当前回答

我很惊讶这里没有ulimit答案。每次我遇到这个问题,我都会在这里或这里结束。我知道这个解决方案有局限性,但ulimit-s 65536似乎经常为我提供帮助。

其他回答

之所以出现这种情况,是因为bash实际上将星号扩展到每个匹配的文件,从而产生一个非常长的命令行。

试试看:

find . -name "*.pdf" -print0 | xargs -0 rm

警告:这是一个递归搜索,也会在子目录中查找(和删除)文件。只有当您确定不需要确认时,才在rm命令中使用-f。

可以执行以下操作以使命令非递归:

find . -maxdepth 1 -name "*.pdf" -print0 | xargs -0 rm

另一个选项是使用find的-delete标志:

find . -name "*.pdf" -delete

一个比使用xargs更安全的版本,也不是递归的:ls-p | grep-v“/$”| grep“\.pdf$”|读取文件时;do rm“$file”;完成

在这里过滤我们的目录有点不必要,因为“rm”无论如何都不会删除它,为了简单起见,可以删除它,但为什么要运行肯定会返回错误的东西呢?

删除目录/path/To/dir_with_pdf_files中的所有*.pdf/

mkdir empty_dir        # Create temp empty dir

rsync -avh --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

如果您有数百万个文件,使用通配符通过rsync删除特定文件可能是最快的解决方案。它会解决你遇到的错误。


(可选步骤):干运行。检查将删除而不删除的内容`

rsync -avhn --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

...

单击rsync提示和技巧以获取更多rsync黑客

查找具有-delete操作:

find . -maxdepth 1 -name '*.pdf' -delete

你可以试试这个:

for f in *.pdf
do
  rm "$f"
done

编辑:ThiefMaster的评论建议我不要向年轻的壳牌公司的绝地武士透露这种危险的做法,所以我会添加一个更“安全”的版本(为了在有人拥有“-rf…pdf”文件时保存东西)

echo "# Whooooo" > /tmp/dummy.sh
for f in '*.pdf'
do
   echo "rm -i \"$f\""
done >> /tmp/dummy.sh

运行以上步骤后,只需在您喜爱的编辑器中打开/tmp/ddumy.sh文件,并检查每一行是否有危险的文件名,如果发现,请将其注释掉。

然后在工作目录中复制dummy.sh脚本并运行它。

所有这些都是出于安全考虑。