【问题标题】:Argument list too long error for rm, cp, mv commandsrm、cp、mv 命令的参数列表太长错误
【发布时间】:2012-07-02 14:58:38
【问题描述】:

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

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

rm -f *.pdf

我收到以下错误:

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

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

【问题讨论】:

标签: linux unix command-line-arguments


【解决方案1】:

适合没有时间的人。 在终端上运行以下命令。

ulimit -S -s unlimited

然后执行cp/mv/rm操作。

【讨论】:

    【解决方案2】:

    tl;博士

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

    问题的根源

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

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

    getconf ARG_MAX
    # 2097152 # on 3.5.0-40-generic
    

    解决方案:使用for循环

    按照BashFAQ/095 的推荐使用for 循环,除RAM/内存空间外没有限制:

    试运行以确定它会删除您所期望的:

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

    并执行它:

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

    这也是一种可移植的方法,因为 glob 在 shell 之间具有强大且一致的行为 (part of POSIX spec)。

    注意:正如几位 cmets 所指出的,这确实更慢但更易于维护,因为它可以适应更复杂的场景,例如其中一个人想要做的不仅仅是一个行动。

    解决方案:使用find

    如果你坚持,你可以使用find,但真的不要使用xargs,因为它在读取非NUL-delimited时是危险的(损坏、可利用等)输入”

    find . -maxdepth 1 -name '*.pdf' -delete 
    

    使用-maxdepth 1 ... -delete 而不是-exec rm {} + 允许find 自己执行所需的系统调用,而不使用外部进程,因此速度更快(感谢@chepner comment)。

    参考文献

    【讨论】:

    • 很好的答案,这就是所有 SO 问题的答案。谢谢!
    • +1 用于提及 for 循环。我以前用过find,但我一直在寻找如何做,因为我总是忘记选项等。 for 似乎更容易记住恕我直言
    • 用它作为for f in *; do rm "$f"; done 工作作为一个魅力
    • find -exec 解决方案似乎比for 循环快得多。
    • 五年后的 4.15.0(确切地说是4.15.0-1019-gcp),限制仍然是 2097152。有趣的是,在 linux git repo 上搜索 ARG_MAX 得到的结果显示 ARG_MAX to be at 131702.
    【解决方案3】:

    我用for解决了

    我在macOSzsh

    我只移动了数千个 jpg 文件。在mv 内一行命令。

    确保您要移动的文件的名称中没有空格或特殊字符
    for i in $(find ~/old -type f -name "*.jpg"); do mv $i ~/new; done
    

    【讨论】:

      【解决方案4】:

      如果它们是带有空格或特殊字符的文件名,请使用:

      find -name "*.pdf"  -delete
      

      仅适用于当前目录中的文件:

      find -maxdepth 1 -name '*.pdf' -delete
      

      这句话搜索当前目录(-maxdepth 1)下所有扩展名为pdf(-name '*.pdf')的文件,然后,删除。

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,包括说明 如何为什么 这解决了问题 would really help 以改进你的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
      • -exec 的全部意义在于您不调用 shell。这里的引号绝对没有用。 (它们可以防止在您键入此命令的 shell 中对字符串 进行任何通配符扩展和标记拆分, 但字符串 {} 不包含任何空格或 shell 通配符。)
      • 使用find,但还是太长了
      【解决方案5】:

      参数列表太长

      作为cpmvrm 的问题标题,但答案主要代表rm

      Un*x 命令

      仔细阅读命令的手册页!

      对于cpmv,有一个-t 开关,用于目标

      find . -type f -name '*.pdf' -exec cp -ait "/path to target" {} +
      

      find . -type f -name '*.pdf' -exec mv -t "/path to target" {} +
      

      脚本方式

      脚本中使用了一个整体解决方法:

      #!/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
      

      【讨论】:

        【解决方案6】:

        如果你想同时删除文件和目录,你可以使用类似的东西:

        echo /path/* | xargs rm -rf
        

        【讨论】:

          【解决方案7】:

          你可以试试这个:

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

          编辑: ThiefMaster 的评论建议我不要向年轻 shell 的绝地武士透露这种危险的做法,所以我会添加一个更“安全”的版本(为了在有人有“-rf ..pdf”文件时保存东西)

          echo "# Whooooo" > /tmp/dummy.sh
          for f in '*.pdf'
          do
             echo "rm -i \"$f\""
          done >> /tmp/dummy.sh
          

          执行上述操作后,只需在您喜欢的编辑器中打开 /tmp/dummy.sh 文件并检查每一行是否存在危险文件名,如果发现则将其注释掉。

          然后将dummy.sh 脚本复制到您的工作目录中并运行它。

          所有这些都是出于安全原因。

          【讨论】:

          • 我认为这对一个名为 e.g. -rf .. .pdf
          • 是的,但通常在 shell 中使用时,命令“应该”的发出者看看他在做什么:)。其实我更喜欢重定向到一个文件,然后检查每一行。
          • 这不引用“$f”。这就是ThiefMaster所说的。 -rf 优先于 -i,所以你的第二个版本也好不到哪里去(没有人工检查)。并且对于批量删除基本上没用,因为提示每个文件。
          • 我添加了缺少的引号,但这仍然存在问题。手动检查数千个文件容易出错且没有必要。
          【解决方案8】:

          更短更可靠的呢?

          for i in **/*.pdf; do rm "$i"; done
          

          【讨论】:

            【解决方案9】:

            rm 命令对可以同时删除的文件有限制。

            您可以根据文件模式多次使用 rm 命令删除它们,例如:

            rm -f A*.pdf
            rm -f B*.pdf
            rm -f C*.pdf
            ...
            rm -f *.pdf
            

            您也可以通过 find 命令删除它们:

            find . -name "*.pdf" -exec rm {} \;
            

            【讨论】:

            • 不,rm 对其将处理的文件数量没有这样的限制(除了它的argc 不能大于INT_MAX)。这是内核对 整个参数数组 最大大小的限制(这就是文件名长度很重要的原因)。
            • 这是一个非常好的解决方案。它不会对原始脚本进行太多更改,并且仍然可以一次删除大量文件。对我来说效果很好。
            【解决方案10】:

            您可以使用 bash 数组:

            files=(*.pdf)
            for((I=0;I<${#files[@]};I+=1000)); do
                rm -f "${files[@]:I:1000}"
            done
            

            这样它会在每一步中批量擦除 1000 个文件。

            【讨论】:

            • 对于大量文件,这似乎要快得多
            • 这只是重新发明xargs,相当糟糕。
            【解决方案11】:

            我很惊讶这里没有ulimit 的答案。每次我遇到这个问题时,我都会以herehere 告终。我知道这个解决方案有局限性,但ulimit -s 65536 似乎经常为我解决问题。

            【讨论】:

              【解决方案12】:

              当一个应用程序创建了数百万个无用的日志文件并填满了所有 inode 时,我遇到了类似的问题。我求助于“定位”,将所有文件“定位”到一个文本文件中,然后一一删除。花了一段时间,但完成了工作!

              【讨论】:

              • 这很模糊,需要您在磁盘上仍有空间时安装locate
              【解决方案13】:

              还有一个:

              cd  /path/to/pdf
              printf "%s\0" *.[Pp][Dd][Ff] | xargs -0 rm
              

              printf 是一个内置的 shell,据我所知,它一直都是这样。现在鉴于printf 不是shell 命令(而是内置命令),它不会出现“argument list too long ...”致命错误。

              所以我们可以安全地将它与*.[Pp][Dd][Ff] 之类的shell globbing 模式一起使用,然后我们通过xargs 将其输出通过管道传递给删除(rm) 命令,以确保它在命令行中适合足够的文件名以免rm命令失败,这是一个shell命令。

              printf 中的\0 用作文件名的空分隔符,然后由xargs 命令处理,使用它(-0)作为分隔符,因此rm 在出现时不会失败是文件名中的空格或其他特殊字符。

              【讨论】:

              • 虽然这段代码 sn-p 可以解决问题,包括说明 如何为什么 这解决了问题 would really help 以改进你的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
              • 特别是,如果printf 不是内置的shell,它将受到同样的限制。
              【解决方案14】:

              我发现对于非常大的文件列表 (>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)
              

              【讨论】:

                【解决方案15】:

                发生这种情况的原因是因为 bash 实际上将星号扩展到每个匹配的文件,从而产生了很长的命令行。

                试试这个:

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

                警告:这是递归搜索,也会在子目录中查找(并删除)文件。仅当您确定不想确认时,才在 rm 命令中添加-f

                您可以执行以下操作以使命令非递归:

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

                另一种选择是使用 find 的 -delete 标志:

                find . -name "*.pdf" -delete
                

                【讨论】:

                • 不,xargs 专门拆分列表并在必要时发出多个命令。
                • @Dennis: -maxdepth 1 需要是路径后的第一个参数。
                • Find 有一个 -delete 标志来删除它找到的文件,即使没有,使用 -exec 执行 rm 仍然被认为是更好的做法,而不是调用 xargs(现在是 3 个进程和一个管道,而不是 -delete 的单个进程或 -exec 的 2 个进程。
                • @ÉdouardLopez ...但这是读取 NULL 分隔的输入。而整个dangerous (broken, exploitable, etc.),相当荒谬。毫无疑问,在使用xargs时应该小心,但它并不完全是eval/evil
                • @scragar 与-exec 调用rm 时,进程数将为1 + 文件数,尽管由此产生的并发进程数可能为2(也许find 会同时执行rm 进程)。使用xargs 的进程数将显着减少到 2 + n,其中 n 是进程数小于文件数(例如文件数 / 10,尽管可能更多取决于路径的长度)。假设 find 直接删除,使用 -delete 应该是唯一会被调用的进程。
                【解决方案16】:

                删除目录/path/to/dir_with_pdf_files/中的所有*.pdf

                mkdir empty_dir        # Create temp empty dir
                
                rsync -avh --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/
                

                如果您有数百万个文件,使用通配符通过rsync 删除特定文件可能是最快的解决方案。它会处理您遇到的错误。


                (可选步骤):试运行。检查哪些内容将被删除而不删除。 `

                rsync -avhn --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/
                

                。 . .

                点击rsync tips and tricks了解更多rsync技巧

                【讨论】:

                  【解决方案17】:

                  如果您尝试一次删除大量文件(我今天删除了一个有 485,000+ 的目录),您可能会遇到此错误:

                  /bin/rm: Argument list too long.
                  

                  问题在于,当您键入 rm -rf * 之类的内容时,* 会被替换为每个匹配文件的列表,例如“rm -rf file1 file2 file3 file4”等等。分配了一个相对较小的内存缓冲区来存储这个参数列表,如果它被填满,shell 将不会执行程序。

                  为了解决这个问题,很多人会使用 find 命令查找每个文件,并将它们一个接一个地传递给“rm”命令,如下所示:

                  find . -type f -exec rm -v {} \;
                  

                  我的问题是我需要删除 500,000 个文件,而且时间太长了。

                  我偶然发现了一种更快的删除文件的方法——“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
                  

                  【讨论】:

                  • 谢谢。我做了sudo find . -type f -delete 删除了大约 485,000 个文件,它对我有用。花了大约 20 秒。
                  【解决方案18】:

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

                  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 中的所有文件,无论有多少。您只需要非常小心,您首先要拥有所有要保留的文件/文件夹,在这种情况下是file1.pdf

                  【讨论】:

                  • 在遇到mv 的文件限制后,我实际上找到了这个页面,所以我不确定这是否能解决问题。
                  【解决方案19】:

                  删除前 100 个文件:

                  rm -rf 'ls |头 -100'

                  【讨论】:

                  • 危险(或者如果您使用反引号显然会是这样) - 如果任何文件名包含 shell 元字符,包括空格,那么结果将不是您想要的。
                  【解决方案20】:

                  也试试这个如果你想删除超过 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 {} \;
                  

                  如果您想将文件 giz 超过 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 {} \;
                  

                  【讨论】:

                    【解决方案21】:

                    使用 GNU 并行 (sudo apt install parallel) 超级简单

                    它以多线程方式运行命令,其中“{}”是传递的参数

                    例如

                    ls /tmp/myfiles* | parallel 'rm {}'

                    【讨论】:

                    • 我不知道,但我猜这是因为将ls 的输出直接传递给其他命令是一种危险的反模式——而且通配符的扩展会导致执行 ls 时出现与原始 rm 命令相同的失败。
                    • 有关这方面的内容,请参阅ParsingLs。而parallel 让一些喜欢避免复杂性的人感到不舒服——如果你深入了解它,它是非常不透明的。请参阅 lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html Stephane(Unix & Linux StackExchange 灰胡子之一)和 Ole Tange(Parallel 的作者)之间的邮件列表线程。 xargs -P 也可以并行化,但它以一种更简单、更笨的方式使用更少的移动部件来实现它,使其行为更容易预测和推理。
                    【解决方案22】:

                    对于这个问题,下面的选项似乎很简单。我从其他线程中获得了此信息,但它对我有所帮助。

                    for file in /usr/op/data/Software/temp/application/openpages-storage/*; do
                        cp "$file" /opt/sw/op-storage/
                    done
                    

                    只需运行上面的一个命令,它就会完成任务。

                    【讨论】:

                      【解决方案23】:

                      我遇到过几次这个问题。许多解决方案将为需要删除的每个单独文件运行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 了解最少甚至没有的人都可以操作此代码。

                      【讨论】:

                      • 如果你最终还是使用os.system() 进行炮击,那么 Python 脚本的意义何在?你想要os.unlink();那么您不必解决无法正确解决的报价问题。但它比find 更有效的唯一原因是它不会递归到子目录中;您可以对printf '%s\0' /tmp/* | xargs -r0 rm -rf 执行相同的操作,当然也可以通过在find 命令中添加-maxdepth 1 选项。
                      • (实际上find 可能会更快,因为shell 会将通配符匹配的文件列表按字母顺序排列,当匹配项很多时,这可能需要大量工作。)跨度>
                      【解决方案24】:

                      我只知道解决这个问题的方法。 这个想法是将您拥有的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)
                      

                      对不起,我的英语不好。

                      【讨论】:

                      • 如果您有一个名为pdf_format_sucks.docx 的文件,该文件也将被删除... ;-) 对 pdf 文件进行 grepping 时应使用正确且准确的正则表达式。
                      • 更好,但still_pdf_format_sucks.docx 将被删除。 ".pdf" 正则表达式中的点 . 匹配任何字符。我建议"[.]pdf$" 而不是.pdf
                      • 但是这对于名称不规则的文件仍然失败,部分原因是缺少引用。如果你真的觉得需要重新实现xargs,你需要了解它处理的所有极端情况。
                      【解决方案25】:

                      你可以使用这个推荐

                      find -name "*.pdf"  -delete
                      

                      【讨论】:

                        【解决方案26】:

                        比使用 xargs 更安全的版本,也不是递归的: ls -p | grep -v '/$' | grep '\.pdf$' | while read file; do rm "$file"; done

                        在这里过滤我们的目录有点不必要,因为'rm'无论如何都不会删除它,为了简单起见可以将其删除,但是为什么运行肯定会返回错误的东西呢?

                        【讨论】:

                        • 这根本不安全,并且不适用于带有换行符的文件名,以指出一个明显的极端情况。 Parsing ls 是一个常见的反模式,绝对应该避免,并在这里添加了一些额外的错误。 grep | grep 不是很优雅。
                        • 无论如何,这并不是一个需要复杂解决方案的新奇问题。 find 的答案很好,在这里和其他地方都有很好的记录。参见例如mywiki.wooledge.org 了解有关此主题和相关主题的更多信息。
                        【解决方案27】:

                        我在一个充满临时图像的文件夹中遇到了同样的问题,而且这个命令帮助我清除了文件夹

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

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

                        多次使用,减少每次执行的日期范围,我能够删除所有不必要的文件

                        【讨论】:

                          【解决方案28】:

                          另一个答案是强制xargs 批量处理命令。例如delete 文件100 一次,cd 进入目录并运行:

                          echo *.pdf | xargs -n 100 rm

                          【讨论】:

                          • 对于在 linux 中删除命令,如果您是工程师并且输入了错误,这可能是一场灾难,我相信这是“最安全的,我知道发生了什么”是最好的。不是花哨的东西,如果你错过输入一个点就会让你的公司在一分钟内崩溃。
                          • 我们怎样才能使它成为某些命令的默认扩展?有很多“标准” linux 命令可以知道它们是否同时需要它们(例如“rm”)
                          • 请注意,这仅适用于 echo 是内置 shell 的情况。如果您最终使用命令echo,您仍然会遇到程序参数限制。
                          • 还有一个固有的问题是echo 可能会产生除文字文件名之外的其他内容。如果文件名包含换行符,它将看起来像xargs 就像两个单独的文件名,你会得到rm: firsthalfbeforenewline: No such file or directory。在某些平台上,包含单引号的文件名也会将xargs 与默认选项混淆。 (而-n 100 可能太低了;只需省略让xargs 找出它需要的最佳进程数的选项。)
                          • 我选择-n 100 作为一个保守的低数字,因为我认为没有任何理由将n 增加到此处“最佳”的程度。
                          【解决方案29】:

                          我在将表单源目录复制到目标时遇到了同样的问题

                          源目录有文件 ~3 lakcs

                          我使用带有选项 -r 的 cp,它对我有用

                          cp -r abc/def/

                          它将所有文件从 abc 复制到 def 而不给出参数列表太长的警告

                          【讨论】:

                          • 我不知道为什么有人对此投了反对票,甚至没有对此发表评论(这是政策,伙计们!)。我需要删除文件夹中的所有文件(请注意,这个问题并不特别针对 PDF),为此,这个技巧效果很好,最后要做的就是重新创建被删除的文件夹我使用了 `rm -R /path/to/folder"。
                          • 之所以有效,是因为在 OP 的情况下,他使用 *,它扩展为一个巨大的 .pdf 列表,提供目录将导致内部处理,因此,不必处理 OP 的问题.我认为出于这个原因它被否决了。如果他的目录中有嵌套目录或其他文件(不是 pdf),它可能对 OP 不可用
                          【解决方案30】:

                          find 有一个-delete 操作:

                          find . -maxdepth 1 -name '*.pdf' -delete
                          

                          【讨论】:

                          • 这仍然会返回“参数列表太长”。至少对我来说是这样。根据丹尼斯的回答,使用 xargs 可以按预期工作。
                          • 这听起来像是 find 中的一个错误。
                          • @Sergio 也有同样的问题,这是由于名称模式周围缺少引号引起的。
                          • 啊,为什么找东西的工具还有删除的开关?真的只有我一个人觉得没必要说也很危险吗?
                          • @mathreadler 它解决了-exec 的一个常见用例是删除一堆文件的事实。 -exec rm {} + 会做同样的事情,但仍需要启动至少一个外部进程。 -delete 允许 find 自己简单地执行所需的系统调用,而无需使用外部包装器。
                          猜你喜欢
                          • 1970-01-01
                          • 2011-08-19
                          • 1970-01-01
                          • 2019-11-15
                          • 2014-12-03
                          • 1970-01-01
                          • 2016-05-30
                          • 2015-06-25
                          • 1970-01-01
                          相关资源
                          最近更新 更多