当我试图检索备份文件时,获取“查找.proc / xxxx没有这样的文件或目录”

时间:2018-03-27 09:45:32

标签: bash scripting

当我尝试使用以下命令搜索文件时:

find . -name $tar_file_name -type f -print0|xargs -0

它给了我那些错误:

find: ‘./proc/12049’: No such file or directory
find: ‘./proc/20958’: No such file or directory
find: ‘./proc/21062’: No such file or directory
find: ‘./proc/21073’: No such file or directory

有谁能告诉我解决这个问题的原因和可能的解决方案?

3 个答案:

答案 0 :(得分:1)

/proc包含文件中的pids信息,因此一旦进程的工作完成,它的pid文件将从那里删除。当find运行/proc/some_pid然后xargs存在并且它已经占用它的内存但是当输出达到find . -name "$tar_file_name" -type f -print0 2>/dev/null |xargs -0 作为标准输入时,那时这些文件被删除了会完成所以它在那里给出一个错误,因为它无法在系统中找到它。要从屏幕上删除错误,您可以在此之后执行此操作。

/proc

或者如果你不想删除所有错误(上面的命令都是这样),那么最好从find命令中忽略find . ! -path '/proc' -name "$tar_file_name" -type f -print0 |xargs -0 路径本身。

simple-webpack

答案 1 :(得分:0)

通过使用“修剪”操作防止proc文件系统的遍历。请注意,“ not”(!)运算符在这种情况下将不起作用,因为仍会遍历proc文件系统,从而导致“没有此类文件或目录”错误。

为防止执行find命令时遍历proc文件系统,请使用 -path /proc -prune

请注意,当find命令中仅执行“ prune”操作时,该命令将(可能是反直觉的)显示已被修剪的文件,而不是忽略这些文件。

从查找手册页:

  

如果该表达式除-prune之外不包含任何其他动作,则在表达式为true的所有文件上执行-print。

为防止这种情况,请使用“打印”操作:-path /proc -prune -o -print 必须在其他缩小搜索范围的选项之后添加打印选项,例如-path /proc -prune -o -name file_to_find -o print。例如,如果正在使用“ exec”操作,则不需要“ print”操作。

答案 2 :(得分:0)

如果您man find,则可以找到以下选项-ignore_readdir_race

 -ignore_readdir_race
              Normally,  find  will  emit  an error message when it
              fails to stat a file.  If you give this option and  a
              file  is deleted between the time find reads the name
              of the file from the directory and the time it  tries
              to  stat  the  file, no error message will be issued.
              This also applies to files or directories whose names
              are  given  on  the  command line.  This option takes
              effect at the time the command line  is  read,  which
              means that you cannot search one part of the filesys-
              tem with this option on and  part  of  it  with  this
              option  off (if you need to do that, you will need to
              issue two find commands instead, one with the  option
              and one without it).

这是解决此问题的最佳实践。