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]

这个错误的解决方案是什么? mvcp命令也会出现此错误吗?如果是,如何解决这些命令?

答案

发生这种情况的原因是因为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答案。每次我遇到这个问题,我都会结束ulimithere。我知道这个解决方案有局限性,但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中的用作文件名的空分隔符,然后由printf命令处理,使用它(xargs)作为分隔符,因此当文件名中有空格或其他特殊字符时,-0不会失败。

另一答案

我只知道解决这个问题的方法。我们的想法是将您拥有的pdf文件列表导出到文件中。然后将该文件拆分为几个部分。然后删除每个部分中列出的pdf文件。

rm

wc -l计算list.txt包含的行数。当你知道它有多长时间时,你可以决定将它分成两半,四分之一。使用split -l命令例如,将它们分成600行。

ls | grep .pdf > list.txt
wc -l list.txt

这将创建一个名为xaa,xab,xac等文件,具体取决于你如何拆分它。现在将这些文件中的每个列表“导入”命令rm,使用:

split -l 600 list.txt

对不起,我的英语不好。

另一答案

试试这个如果你想删除30/90天以上(+)或者30/90( - )天以下的文件/文件夹,那么你可以使用下面的ex命令

例如:90天后文件/文件夹删除90天后排除上述,这意味着91,92 .... 100天

rm $(<xaa)
rm $(<xab)
rm $(<xac)

例如:对于您想要删除的最新30天文件,请使用以下命令( - )

find <path> -type f -mtime +90 -exec rm -rf {} ;

如果你想要文件超过2天giz文件

find <path> -type f -mtime -30 -exec rm -rf {} ;

如果你只想看过去一个月的文件/文件夹。例如:

find <path> -type f -mtime +2 -exec gzip {} ;

超过30天以上只列出文件/文件夹Ex:

find <path> -type f -mtime -30 -exec ls -lrt {} ;
另一答案

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

find <path> -type f -mtime +30 -exec ls -lrt {} ;

find /opt/app/logs -type f -mtime +30 -exec ls -lrt {} ;

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_folder

另一答案

tl;博士

这是对命令行参数大小的内核限制。请改用for循环。

问题的根源

这是一个系统问题,与execveARG_MAX常数有关。有大量关于此的文档(请参阅man execvedebian's wiki)。

基本上,扩展产生的命令(其参数)超过了ARG_MAX限制。在内核2.6.23上,限制设置为128 kB。这个常量已经增加,你可以通过执行以下方法获得它的值:

getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic

解决方案:使用for循环

for上使用BashFAQ/095循环,除了RAM /内存空间之外没有限制:

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

这也是一种可移植的方法,因为blob在shell(qazxsw poi)中具有强大且一致的行为。

注意:正如一些评论所指出的那样,这确实更慢但更易于维护,因为它可以适应更复杂的情况,例如:人们想要做的不仅仅是一个动作。

解决方案:使用part of POSIX spec

如果你坚持,你可以使用find,但实际上不使用xargs,因为它“在读取非NUL分隔的输入时是危险的(破坏,可利用等)”:

find

使用find . -maxdepth 1 -name '*.pdf' -delete 而不是-maxdepth 1 ... -delete允许-exec rm {} +在不使用外部进程的情况下简单地执行所需的系统调用,因此更快(感谢find)。

参考

另一答案

删除目录file1.pdf中的所有*.pdf

/path/to/dir_with_pdf_files/

使用通配符通过mkdir empty_dir # Create temp empty dir rsync -avh --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/ 删除特定文件可能是最快的解决方案,以防你有数百万个文件。它会照顾你得到的错误。


(可选步骤):DRY RUN。检查将删除的内容而不删除。 `

rsync

. . .

点击rsync -avhn --delete --include '*.pdf' empty_dir/

以上是关于rm,cp,mv命令的参数列表太长错误的主要内容,如果未能解决你的问题,请参考以下文章

Linux入门培训教程 linux下拷贝cp删除rm移动mv命令参数以及说明

Linux命令rm,mv,cp报argument list too long错误

Linux命令rm,mv,cp报argument list too long错误

linux-14基础命令之-复制(cp)移动(mv),删除(rm),拷贝文件(dd)

自学Linux Shell3.4-文件处理命令touch cp mv rm

使用rm cp mv 命令