2つの異なるディレクトリ間の共通サブディレクトリ名を識別して削除します。

2つの異なるディレクトリ間の共通サブディレクトリ名を識別して削除します。

数百のサブディレクトリを持つ2つのディレクトリがありますdir1。私は共有されているサブディレクトリ名に関する情報を必要とし、その名前を体系的に削除する必要があります。ファイルやファイルの内容を比較する必要はありません。パフォーマンスdir2depth 1dir1dir2dir2

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削除します。dir2dir1

まずパイプを取り外し、出力を確認して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

正しい場合は、エコーを削除してください。

関連情報