当我尝试使用以下命令搜索文件时:
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
有谁能告诉我解决这个问题的原因和可能的解决方案?
答案 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).
这是解决此问题的最佳实践。