如何查找并清空某些目录

如何查找并清空某些目录

我想查找并删除内容,同时保持目录本身完好无损。

下列

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 选项的情况下尝试此命令。所以它无法删除目录。

相关内容