ディレクトリ自体をそのまま維持しながら、コンテンツを見つけて削除したいと思います。
次のような
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のサブシェルを使用してディレクトリから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});
}
}
まずディレクトリを渡し、次に一致する名前を渡します。もはやシェルの1行ではなく、動作し、ディレクトリを破損させず、偽の警告を表示しません。