数百のサブディレクトリを持つ2つのディレクトリがありますdir1
。私は共有されているサブディレクトリ名に関する情報を必要とし、その名前を体系的に削除する必要があります。ファイルやファイルの内容を比較する必要はありません。パフォーマンスdir2
depth 1
dir1
dir2
dir2
diff -qr dir_one dir_two | sort
また、現在は興味のないファイル名も生成します。
ベストアンサー1
あなたのユースケースに応じて避けることができます確認するパブリックディレクトリはrm -rf
存在しないディレクトリは無視されるからです。
それではそれで十分です。find
みんなディレクトリdir1
から削除します dir2
。
find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 rm -rf --
いくつかの説明。デフォルトでは、find
すべてのディレクトリはフルパスで印刷されますdir1
。したがって、-printf
削除する先行ディレクトリ(%f)と追加のパス"dir2"なしでファイル名のみを印刷します。また、xarg
オプションを使用するために文字列を終了するために改行の代わりにヌルバイト "\ 0"を使用します。-0
これは、空白のあるファイル名に対してこれらすべてを安全にします。次に、標準入力をxargs
読み取りrm
、すべての文字列を引数として追加してコマンドを実行します。
echo
実際に削除する前に、印刷専用コマンドを追加してコマンドラインをテストできますrm
。
find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 echo rm -rf --
ただリストls
代わりに、通常のディレクトリを使用できますrm
(存在しないディレクトリを無視するには、2> / dev / nullを追加)。
find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 -r ls -d -- 2>/dev/null