パターンに一致するファイルを含むすべてのフォルダを削除する

パターンに一致するファイルを含むすべてのフォルダを削除する

rarファイルを含む現在の作業ディレクトリのすべてのサブディレクトリを削除しようとしています。

最初の試み:find -name *.rar -exec rm -r {}/.. ';'有効なディレクトリではないため失敗しました。もっと合理的なコマンドを試してみましたが、dirname {}意図しない内容をほとんど削除してから質問をすることにしました。

Windows 7でCygwinを使用しています。

答え1

zshを使う:

rm -rf **/*.rar(:h)

サフィックス:hが適用されます歴史拡張修飾子 h("head")各一致のデフォルト名を削除し、ディレクトリ部分のみを残します。

このディレクトリが実際に削除したいディレクトリであることを確認してください!たとえば、まず一時ディレクトリに移動します。

mkdir DELETE
mv **/*.rar(:h) DELETE/
# check that you really want to delete everything in DELETE
rm -r DELETE

答え2

findを使用してbash -c高度な操作を実行できます-exec。 catで一時ファイルを使用する際の問題は、ファイルにxargsスペース、改行、またはタブが含まれていると中断されることです。次は動作します。

find . -type f -name '*.rar' -exec bash -c 'rm -rf "${@%/*}"' -- {} +

+"$@"で検索を使用すると、を使用するのとrm同じように一度実行されますxargs

答え3

一対のステートメントを使用してこれを実行できます。

まず、次のコマンドを使用して削除するディレクトリのリストを取得します。

find -name *.rar -exec dirname {} ';' > toremove

次に、cat toremove目的のフォルダが含まれていることを確認してください。その後、渡してrm -rf使用してください。

sed 's/^/"/g' toremove | sed 's/$/"/g' | xargs rm -r

最後に、rm toremove

答え4

次のように試すことができます。

for dir in */; do             # iterate all subdirectories
    touch $dir"dummy.rar"     # create a "rar"-file...
    for file in $dir*.rar; do # ...so this won't break on zero such
        rm $file              # remove the dummy, and all archives
    done
done

関連情報