bashの親フォルダと同じ名前のフォルダを繰り返し削除しますか?

bashの親フォルダと同じ名前のフォルダを繰り返し削除しますか?

マイコンピュータの1つでファイルの複製に問題があります。親フォルダに名前が同じすべてのフォルダのコピーがありますが、スペースが多く無駄になっていてすべて削除したいと思います。

例:

 /mnt/test/files/foo
 \_ /mnt/test/files/foo/file1 (etc)
 |__ /mnt/test/files/foo/foo
 \_ /mnt/test/files/foo/foo/file1 (etc)
 |_ /mnt/files/foo/foo2
  \_ /mnt/files/foo/foo2/file1 (etc)
 |_ /mnt/files/foo/foo2/foo2
  \_ /mnt/files/foo/foo2/foo2/file1 (etc)

/mnt/files/foo/foo明らかに私はそれとその/mnt/files/foo/foo2/foo2内容(など)を完全に削除し、スペースの無駄を止めたいと思います。 Bashでスクリプトを書くための良い方法は何ですか?

答え1

find述語をサポートしている場合は、次のように-regexディレクトリを一覧表示できます。

find . -type d -regex '.*/\([^/]*\)/\1' -prune -print

これを削除するには、次のように変更できます-print

-exec rm -rf {} +

ただし、必要なファイルを削除しないように、まずリストを確認してください。

答え2

非GNUを使用する(しかし、BSDシステムなどでfindまだサポートされているいくつかの実装があります):-mindepthfind

find top-dir -depth -mindepth 1 -type d -exec sh -c '
    for pathname do
        subdir=$pathname/${pathname##*/}
        if [ -d "$subdir" ]; then
            printf "Would remove directory %s\n" "$subdir"
            # rm -rfi "$subdir"
        fi
    done' sh {} +

これにより、ルートから始まり、ディレクトリ階層の深さ優先巡回が実行されますtop-dir。デプロイメントで見つかったディレクトリパス名の場合、ショートシェルスクリプトが呼び出されます。短いシェルスクリプトのループが繰り返されるたびに、ディレクトリ$pathname自体と同じ名前のディレクトリ内のサブディレクトリパス名が設定されます。このサブディレクトリが存在する場合に報告されます(削除は現在安全上の理由でコメントアウトされています)。

この-depthオプションを使用すると、深さ優先巡回が発生します。これは通常、ディレクトリを削除するためにasを使用するときに望むものです。findそれ以外の場合は、find削除されたディレクトリに入ろうとする可能性があります。

この-mindepth 1オプションを使用すると、最上位ディレクトリが開始.検索パスとして使用されるため、削除されません。

関連:

関連情報