Linux 在bash脚本中查找命令,结果为;没有这样的文件或目录;错误仅适用于目录?
更新2014-03-21 因此,我意识到我并没有尽可能的高效,因为我需要“清理”的所有磁盘都在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 {} \;
/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 {} \;