Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash脚本中查找命令,结果为;没有这样的文件或目录;错误仅适用于目录?_Linux_Bash_Scripting_Find - Fatal编程技术网

Linux 在bash脚本中查找命令,结果为;没有这样的文件或目录;错误仅适用于目录?

Linux 在bash脚本中查找命令,结果为;没有这样的文件或目录;错误仅适用于目录?,linux,bash,scripting,find,Linux,Bash,Scripting,Find,更新2014-03-21 因此,我意识到我并没有尽可能的高效,因为我需要“清理”的所有磁盘都在/media下,并命名为“disk1,disk2,disk3,等等。”最后的脚本如下: DIRTY_DIR="/media/disk*" find $DIRTY_DIR -depth -type d -name .AppleDouble -exec rm -rf {} \; find $DIRTY_DIR -depth -type d -name .AppleDB -exec rm -rf {} \;

更新2014-03-21

因此,我意识到我并没有尽可能的高效,因为我需要“清理”的所有磁盘都在
/media
下,并命名为“
disk1
disk2
disk3
,等等。”最后的脚本如下:

DIRTY_DIR="/media/disk*" 
find $DIRTY_DIR -depth -type d -name .AppleDouble -exec rm -rf {} \;
find $DIRTY_DIR -depth -type d -name .AppleDB -exec rm -rf {} \;
find $DIRTY_DIR -depth -type d -name .AppleDesktop -exec rm -rf {} \;
find $DIRTY_DIR -type f -name ".*DS_Store" -exec rm -f {} \;
find $DIRTY_DIR -type f -name ".Thumbs.db" -exec rm -f {} \; #  I know, I know, this is a Windows file.
下一步可能只是进一步清理代码,并添加日志记录和报告结果(通过电子邮件或其他方式)等功能;不包括系统和目录;允许用户自定义文件/目录列表

谢谢你的帮助

更新

在我采纳大家提供的有用建议之前,我进行了一些测试,结果非常有趣(见下文)

作为测试,我运行了以下命令:

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec echo rm -rf {} \;
结果(这是我所期望的):

但是,当我运行实际命令时(没有
echo
):

我收到了相同的“错误”输出:

我将“error”放在引号中,因为很明显,文件夹已被删除,通过立即运行以下命令进行验证:

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec rm -rf {} \;
root@doi:~# 
似乎是
find
命令存储了原始结果,通过删除目录对其进行操作,然后再次尝试删除它?或者,
rm
-f
选项应该用于忽略不存在的文件和参数,是否被忽略?我注意到,当我单独使用
rm
命令而不使用
find
命令运行测试时,一切都按预期运行。因此,直接运行
rm-rf\不存在的\u目录
,即使“不存在的\u目录”不存在,也不会返回任何错误,并且直接运行
rm-r\nonexistent\u目录
,提供了预期的:

rm -rf /media/disk3/Videos/Chorus/.AppleDouble
rm: cannot remove 'non_existent_directory': No such file or directory
我应该使用
-delete
选项而不是
-exec rm…
选项吗?我想使脚本尽可能广泛地适用于没有
查找
-delete
选项的系统

最后,我认为如果
/media/disk1
/media/disk2
。。。当
find
命令在单个磁盘上运行时,是否在
/media/storage
下的AUFS文件系统中合并? 谢谢你们的帮助,伙计们。完成后,我将发布脚本

原创帖子

我正在编写一个bash脚本来删除我的Lubuntu文件共享上的一些遗留操作系统X。但是,在执行此操作时:

...
BASE_DIR="/media/disk" # I have 4 disks: disk1, disk2, ...   
COUNTER=1

while [ $COUNTER -lt 5 ]; do      # Iterate through disk1, disk2, ...
   DIRTY_DIR=${BASE_DIR}$COUNTER     # Look under the current disk counter /media/disk1, /media/disk2, ...
   find $DIRTY_DIR -name \.AppleDouble -exec rm -rf {} \;    # Delete all .AppleDouble directories
   find $DIRTY_DIR -name ".*DS_Store" -exec rm -rf {} \;     # Delete all .DS_Store and ._.DS_Store files
   COUNTER=$(($COUNTER+1))
done
...
我看到以下输出:

查找:
/media/disk1/Pictures/.AppleDouble
:没有这样的文件或目录

在添加
-exec rm…
部分之前,脚本找到了
/media/disk1/Pictures/.AppleDouble
目录。该脚本在删除DS_存储文件时工作正常,但是对于目录的find命令,我缺少了什么


我害怕对
-exec
部分做太多的修改,因为我不想错误地删除目录。

您不需要在shell glob中转义点,因为这不是regex。因此,请使用
.AppleDouble
而不是
\.AppleDouble

find $DIRTY_DIR -name .AppleDouble -exec rm -rf '{}' \;

PS:我看不到脚本中任何地方的
$COUNTER
都在增加。

tl;dr-Pass
-prune
如果使用
find
删除目录

对于任何在这个问题上遇到困难的人。运行这样一个示例

find /media/disk3 -type d -name .AppleDouble -exec rm -rf {} \;
结果会导致如下错误:

rm: cannot remove 'non_existent_directory': No such file or directory
使用find查找和删除目录时,您经常会遇到此错误,因为
find
将目录存储到处理子目录,然后使用
exec
将其删除,然后尝试遍历不再存在的子目录

您可以传递
-maxdepth 0
-prune
以防止此问题。像这样:

find /media/disk3 -type d -name .AppleDouble -prune -exec rm -rf {} \;

现在它删除了目录,没有任何错误。万岁!:)

您可能在第一个屏幕上有一个
-type d
标志,在第二个屏幕上有一个
-type f
标志(第二个屏幕上也不需要
rm
上的
r
)。因此,它不会删除命名类似于目录的文件,反之亦然,因此它不会不必要地下降。我会添加
-depth
,以确保在删除之前删除。/a/b/X/c/X。/a/b/X@BroSlow谢谢你抓住那些。我知道我应该更小心一点,并将其添加到我的脚本中。@glenn在这种情况下,如果删除了/a/b/X会不会很糟糕,因为我不想保留任何内容。不管怎样,还是应用双倍?您的体验可能是,当您不使用
-delete
时,您没有隐含的
-depth
选项;因此,您最终删除的文件已经被find命令的前一次迭代删除。有关详细信息,请参阅。很抱歉,我忘了将其放在脚本的“编辑”版本中。它实际上就在那里,当我删除“脚本中不相关的部分”时,我忘了保存它。好的,我现在看到了编辑过的问题。你能试试看:
find/media/disk3-type d-name.AppleDouble-exec-rm-rf'{}\\;-prune
命令吗?所以它是一个东西的组合——看看我上面做了什么。
rm: cannot remove 'non_existent_directory': No such file or directory
find /media/disk3 -type d -name .AppleDouble -prune -exec rm -rf {} \;