Unix cp参数列表太长

23

我正在使用AIX操作系统。

当我尝试使用以下命令将一个文件夹中的所有文件复制到另一个文件夹时:

cp ./00012524/*.PDF ./dummy01

终端会报错:

ksh:/usr/bin/cp:0403-027 参数列表过长。

如何解决这个问题?我的文件夹中包含8xxxx个文件,如何快速复制它们?每个文件的大小在4x kb到1xx kb之间。


可能是rm、cp、mv命令的参数列表过长错误的重复问题。 - jww
运行“ulimit -S -s unlimited”命令。然后执行cp/mv/rm操作。 - Dhiren Hamal
7个回答

26
在*nix中使用find命令:
find ./00012524 -type f -name "*.PDF" -exec cp {} ./dummy01/ \; -print

1
通常情况下,我还会添加一个“-type d”。匹配 */PDF 的目录应该很少见,但对于更一般的复制,这将避免由于首先复制父目录(或在没有-r标志的情况下失败)然后复制子目录而导致多个副本。 - FGM

6

cp命令存在一定的限制,即无法同时复制大量文件。

你可以通过多次使用基于文件模式的cp命令来复制它们,例如:

cp ./00012524/A*.PDF ./dummy01
cp ./00012524/B*.PDF ./dummy01
cp ./00012524/C*.PDF ./dummy01
...
cp ./00012524/*.PDF ./dummy01

你也可以通过find命令进行复制:
find ./00012524 -name "*.PDF" -exec cp {} ./dummy01/ \;

1
我使用find命令时出现了“省略目录'./00012524'”的提示。 - pir

2
$ ( cd 00012524; ls | grep '\.PDF$' | xargs -I{} cp {} ../dummy01/ )

1

-t标志对于cp命令在这里非常有用:

find ./00012524 -name \*.PDF -print | xargs cp -t ./dummy01


1

复制大量文件从一个目录到另一个目录的最佳命令。

find /path/to/source/ -name "*" -exec cp -ruf "{}" /path/to/destination/ \;

这对我非常有帮助。


cp: illegal option -- u - geoidesic

0
你可以这样做,获取目录中的每一行。

# you can use the -rv to check the status of the command verbose

for i in /from_dir/*; do cp -rv "$i" /to_dir/; done


0
你应该能够使用for循环,例如:
for f in $(ls ./00012524/*.pdf)
do
    cp $f ./dummy01
done

我无法测试这个,但理论上应该可以工作。


1
ls 命令很可能(读作“几乎肯定”)会出现相同的错误。在类 Unix 系统上,参数过长是 C 库的标准错误(有关此问题,请参阅 man sysconf)。最好的方法是使用 find ... | cpio -pvumd ... 或使用 xargs 或 tar c...| tar x 等命令。这些命令都不需要 shell 扩展的 glob,这是导致他的问题的原因。这个问题更适合 SeverFault 或 SuperUser,而不是 SO。 - Jim Dennis
改进版:for f in ./00012524/*.pdf; do,但是使用 find+xargs+cp -t 更快。 - Zsigmond Lőrinczy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接