数百のサブディレクトリを持つ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
答え2
comm -1 -3 <( cd dir1 && find -maxdepth 1 -type d | sort ) <( cd dir2 && find -maxdepth 1 -type d | sort ) | ( cd dir2 && xargs rm -rf )
読みやすくするために改行文字を使用してください。
comm -1 -3 <( cd dir1 && find -maxdepth 1 -type d | sort ) \
<( cd dir2 && find -maxdepth 1 -type d | sort ) \
| ( cd dir2 && xargs rm -rf )
説明する
find -maxdepth 1 -type d
サブディレクトリなしでディレクトリのみを一覧表示します。
cd dir1 && find -maxdepth 1 -type d | sort
まず、ディレクトリを変更してからディレクトリを一覧表示します。
<( ... )
comm -1 -3 <( ... ) <( ... )
最初の入力と2番目の入力を取得し、2番目の入力に固有の行を印刷します。効果的に、これはdir2
場所があるにはないディレクトリを印刷しますdir1
。
... | ( cd dir2 && xargs rm -rf )
作業ディレクトリを変更し、dir2
前のコマンドの出力を引数として使用して実行します。効果的に、これは場所が存在するが存在しないディレクトリをrm -rf
削除します。dir2
dir1
まずパイプを取り外し、出力を確認してxargs
テストします。
答え3
find dir1 dir2 -maxdepth 2 | egrep '/' | xargs --max-args 1 basename | sort | uniq -c | egrep -v '^ 1 ' | while read n de ; do echo rm -rfv dir2/$de ; done
正しい場合は、エコーを削除してください。