マイコンピュータの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
まだサポートされているいくつかの実装があります):-mindepth
find
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
オプションを使用すると、最上位ディレクトリが開始.
検索パスとして使用されるため、削除されません。
関連: