rm,cp,mv命令的参数列表太长错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rm,cp,mv命令的参数列表太长错误相关的知识,希望对你有一定的参考价值。
我在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
警告:这是一个递归搜索,也会在子目录中找到(和删除)文件。只有在您确定不需要确认时,才能将-f
添加到rm命令。
您可以执行以下操作以使命令非递归:
find . -maxdepth 1 -name "*.pdf" -print0 | xargs -0 rm
另一种选择是使用find的-delete
标志:
find . -name "*.pdf" -delete
如果它们是带空格或特殊字符的文件名,请使用:
find -name "*.pdf" -delete
这句话用扩展名pdf(-name'* .pdf')搜索当前目录(-maxdepth 1)中的所有文件,然后删除每一个文件(-exec rm“{}”)。
表达式{}替换文件的名称,“{}”将文件名设置为字符串,包括空格或特殊字符。
在将表单源目录复制到目标时,我遇到了同样的问题
源目录有~3万卢比的文件
我使用选项-r的cp,它对我有用
cp -r abc / def /
它会将所有文件从abc复制到def,而不会过长地发出Argument列表的警告
rm命令具有可以同时删除的文件的限制。
您可以使用多次rm命令删除它们的一种可能性是基于您的文件模式,例如:
find -maxdepth 1 -name '*.pdf' -exec rm "{}" ;
您也可以通过find命令删除它们:
rm -f A*.pdf
rm -f B*.pdf
rm -f C*.pdf
...
rm -f *.pdf
find . -name "*.pdf" -exec rm {} ;
我很惊讶这里没有find . -type f -name '*xxx' -print -delete
答案。每次我遇到这个问题,我都会结束ulimit
或here。我知道这个解决方案有局限性,但here似乎经常为我做的伎俩。
我碰到了几次这个问题。许多解决方案将为需要删除的每个文件运行ulimit -s 65536
命令。这是非常低效的:
rm
我最后编写了一个python脚本,根据文件名中的前4个字符删除文件:
find . -name "*.pdf" -print0 | xargs -0 rm -rf
这对我很有用。我能够在大约15分钟内清除文件夹中超过200万个临时文件。我从一点点代码中评论了tar,所以任何具有最小到没有python知识的人都可以操作这段代码。
还有一个:
import os
filedir = '/tmp/' #The directory you wish to run rm on
filelist = (os.listdir(filedir)) #gets listing of all files in the specified dir
newlist = [] #Makes a blank list named newlist
for i in filelist:
if str((i)[:4]) not in newlist: #This makes sure that the elements are unique for newlist
newlist.append((i)[:4]) #This takes only the first 4 charcters of the folder/filename and appends it to newlist
for i in newlist:
if 'tmp' in i: #If statment to look for tmp in the filename/dirname
print ('Running command rm -rf '+str(filedir)+str(i)+'* : File Count: '+str(len(os.listdir(filedir)))) #Prints the command to be run and a total file count
os.system('rm -rf '+str(filedir)+str(i)+'*') #Actual shell command
print ('DONE')
cd /path/to/pdf
printf "%s " *.[Pp][Dd][Ff] | xargs -0 rm
是一个内置的shell,据我所知,它一直都是这样的。现在假设printf
不是shell命令(但是内置),它不受“printf
”致命错误的影响。
所以我们可以安全地使用它与shell globbing模式,如argument list too long ...
,然后我们通过*.[Pp][Dd][Ff]
管道输出删除(rm
)命令,这确保它在命令行中适合足够的文件名,以免xargs
命令失败,这是一个shell命令。
rm
中的