我在UNIX的一个目录下有几百个PDF。PDF的名称非常长(约60个字符)。
当我尝试使用以下命令一起删除所有PDF时:
rm -f *.pdf
我收到以下错误:
/bin/rm: cannot execute [Argument list too long]
此错误的解决方案是什么?mv和cp命令是否也会出现此错误?如果是,如何解决这些命令?
我在UNIX的一个目录下有几百个PDF。PDF的名称非常长(约60个字符)。
当我尝试使用以下命令一起删除所有PDF时:
rm -f *.pdf
我收到以下错误:
/bin/rm: cannot execute [Argument list too long]
此错误的解决方案是什么?mv和cp命令是否也会出现此错误?如果是,如何解决这些命令?
当前回答
查找具有-delete操作:
find . -maxdepth 1 -name '*.pdf' -delete
其他回答
如果它们是带有空格或特殊字符的文件名,请使用:
find -name "*.pdf" -delete
仅适用于当前目录中的文件:
find -maxdepth 1 -name '*.pdf' -delete
这句话搜索当前目录(-maxdeph 1)中扩展名为pdf(-name'*.pdf')的所有文件,然后删除。
我在将源目录复制到目标目录时遇到了同样的问题
源目录包含文件约3 lakcs
我使用cp和选项-r,这对我很有用
cp-r abc/def/
它会将所有文件从abc复制到def,而不会发出参数列表过长的警告
我发现对于非常大的文件列表(>1e6),这些答案太慢了。这里有一个在python中使用并行处理的解决方案。我知道,我知道,这不是linux。。。但这里没有其他办法奏效。
(这节省了我几个小时)
# delete files
import os as os
import glob
import multiprocessing as mp
directory = r'your/directory'
os.chdir(directory)
files_names = [i for i in glob.glob('*.{}'.format('pdf'))]
# report errors from pool
def callback_error(result):
print('error', result)
# delete file using system command
def delete_files(file_name):
os.system('rm -rf ' + file_name)
pool = mp.Pool(12)
# or use pool = mp.Pool(mp.cpu_count())
if __name__ == '__main__':
for file_name in files_names:
print(file_name)
pool.apply_async(delete_files,[file_name], error_callback=callback_error)
如果您试图一次删除大量文件(我今天删除了一个485000+的目录),您可能会遇到以下错误:
/bin/rm: Argument list too long.
问题是,当您键入类似rm-rf*的内容时,*将被替换为每个匹配文件的列表,如“rm-rf file1 file2 file3 file4”等。分配了一个相对较小的内存缓冲区来存储此参数列表,如果该缓冲区已满,shell将不会执行程序。
为了解决这个问题,很多人会使用find命令查找每个文件,并将它们逐一传递给“rm”命令,如下所示:
find . -type f -exec rm -v {} \;
我的问题是我需要删除50万个文件,而且时间太长了。
我偶然发现了一种更快的删除文件的方法——“find”命令内置了“-delete”标志!以下是我最终使用的:
find . -type f -delete
使用这种方法,我以每秒2000个文件的速度删除文件,速度快得多!
您还可以在删除文件名时显示文件名:
find . -type f -print -delete
…甚至显示将删除多少文件,以及删除这些文件所需的时间:
root@devel# ls -1 | wc -l && time find . -type f -delete
100000
real 0m3.660s
user 0m0.036s
sys 0m0.552s
使用GNU并行(sudo apt install parallel)非常简单
它以多线程方式运行命令,其中“{}”是传递的参数
E.g.
ls/tmp/myfiles*|并行“rm{}”