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

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

rm -f *.pdf

我收到以下错误:

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

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


当前回答

参数列表太长

作为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

其他回答

我遇到过几次这个问题。许多解决方案将为每个需要删除的文件运行rm命令。这是非常低效的:

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

我最终编写了一个python脚本,根据文件名中的前4个字符删除文件:

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')

这对我来说非常有效。我能够在大约15分钟内清除一个文件夹中超过200万个临时文件。我从一点点代码中对tar进行了注释,这样任何一个对python一无所知的人都可以操作这段代码。

我只知道一个办法。这个想法是将你拥有的pdf文件列表导出到一个文件中。然后将该文件分成几个部分。然后删除每个部分中列出的pdf文件。

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

wc-l是计算list.txt包含的行数。当你知道它有多长时,你可以决定把它分成两半、四等分或其他什么。使用split-l命令例如,将其分成600行。

split -l 600 list.txt

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

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

对不起,我的英语不好。

你可以试试这个:

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脚本并运行它。

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

我也遇到了同样的问题,因为一个文件夹中的临时图像与日俱增,这个命令帮助我清除了这个文件夹

find . -name "*.png" -mtime +50 -exec rm {} \;

与其他命令的不同之处在于mtime参数,该参数将只接受早于X天的文件(在示例中为50天)

多次使用这种方法,减少每天执行的次数,我能够删除所有不必要的文件

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

例如:对于删除90天文件/文件夹后的90天不包括上述内容,这意味着91、92……100天

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

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

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

如果你想保存文件超过2天

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

如果您只想查看过去一个月的文件/文件夹。前任:

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

30天以上,然后列出文件/文件夹前任:

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

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