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

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

rm -f *.pdf

我收到以下错误:

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

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


当前回答

之所以出现这种情况,是因为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

其他回答

参数列表太长

作为cp、mv和rm的问题标题,但答案主要代表rm。

Un*x命令

仔细阅读命令的手册页!

对于cp和mv,有一个-t开关,用于目标:

find . -type f -name '*.pdf' -exec cp -ait "/path to target" {} +

and

find . -type f -name '*.pdf' -exec mv -t "/path to target" {} +

脚本方式

bash脚本中使用了一个整体解决方案:

#!/bin/bash

folder=( "/path to folder" "/path to anther folder" )

if [ "$1" != "--run" ] ;then
    exec find "${folder[@]}" -type f -name '*.pdf' -exec $0 --run {} +
    exit 0;
fi

shift

for file ;do
    printf "Doing something with '%s'.\n" "$file"
done

还有一个:

cd  /path/to/pdf
printf "%s\0" *.[Pp][Dd][Ff] | xargs -0 rm

printf是一个内置的shell,据我所知,它一直都是这样的。既然printf不是一个shell命令(而是一个内置命令),它就不会出现“参数列表太长…”致命错误。

因此,我们可以安全地将其与*等shell globbing模式一起使用。[Pp][Dd][Ff],然后我们通过xargs将其输出通过管道传输到remove(rm)命令,这确保它在命令行中适合足够的文件名,以免rm命令(shell命令)失败。

printf中的\0用作文件名的空分隔符,然后由xargs命令处理,使用它(-0)作为分隔符,因此当文件名中有空格或其他特殊字符时,rm不会失败。

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

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

我用解决了

我在macOS上使用zsh

我只移动了数千个jpg文件。在一行命令中的mv内。

确保要移动的文件名中没有空格或特殊字符

for i in $(find ~/old -type f -name "*.jpg"); do mv $i ~/new; done

您可以创建一个临时文件夹,将所有要保留的文件和子文件夹移动到临时文件夹中,然后删除旧文件夹并将临时文件夹重命名为旧文件夹。请尝试以下示例,直到您确信可以执行此操作:

mkdir testit
cd testit
mkdir big_folder tmp_folder
touch big_folder/file1.pdf
touch big_folder/file2.pdf
mv big_folder/file1,pdf tmp_folder/
rm -r big_folder
mv tmp_folder big_folder

rm-r big_folder将删除big_fold器中的所有文件,无论文件有多少。你只需要非常小心,你首先要保存所有的文件/文件夹,在本例中是file1.pdf