我想查找并删除内容,同时保持目录本身完好无损。
下列
find /data1 -name MyTargetDir -type d -exec rm -rv {} \;
和
find /data1 -name MyTargetDir -type d | xargs -r rm -vfr
删除“MyTargetDir”和“MyTargetDir”下的所有文件和目录。
我想保留该目录,但它是空的。
答案1
重新创建目录似乎是一种非常干净的方法。
find /data1 -name MyTargetDir -type d -exec rm -rv {} \; -exec mkdir {} \;
您可以改为在 exec 中使用子 shell 从目录中运行 rm -rf * (或类似的)。但这似乎比上面更麻烦。如果出现问题,您会产生清理目录大小的副作用。
如前所述,重新创建目录可能是一个太大的问题。如果是这样,替代方案可能是:
find /data1 -name MyTargetDir -type d -exec bash "-c" "cd {} && rm -r -- * .*" \;
这有一个不幸的问题,即抱怨尝试删除“.”。和“..”,但应该是安全的。
否则,您可以选择完整的脚本解决方案,例如 perl。
#!/path/to/perl
use strict;
use warnings;
use File::Find;
use File::Path qw/remove_tree/;
my ($dir_to_check, $name_to_remove) = @ARGV;
find(\&wanted, $dir_to_check);
sub wanted {
if (-d and $_ eq $name_to_remove) {
remove_tree($_, {keep_root => 1});
}
}
首先传入目录,然后传入要匹配的名称。它不再是 shell 的一句台词,但它可以工作,不会破坏目录,也不会发出任何虚假的警告。
答案2
rm -rf MyTargetDir && mkdir MyTargetDir
它应该做你想做的事。
答案3
毫无疑问,有更好的方法可以做到这一点,但这应该有效:
for MyTargetDir in `find /data1 -name MyTargetDir -type d -depth`
do
if [ $MyTargetDir != "" ]; then
rm -rfvi $MyTargetDir/*
fi
done
if
如果您找不到要查找的目录,则需要使用该语句,在这种情况下该rm
命令将破坏您的根文件系统。因此,如果我编写的内容存在错误,我还指定了该i
选项,以便您在命令开始删除文件之前收到警告;一旦您对它按预期工作感到满意,您就可以删除该i
选项。
答案4
或者您可以在 rm 中不使用 r 选项的情况下尝试此命令。所以它无法删除目录。