特定の文字列で始まるすべてのディレクトリを削除する

特定の文字列で始まるすべてのディレクトリを削除する

graphene-80で始まるすべてのディレクトリを削除するには、どのコマンドを使用する必要がありますか/tmp

rmコマンドにオプションとして何を追加できますか?

ベストアンサー1

パターンに一致するディレクトリの削除graphene-80* すぐ下/tmp、使用

rm -rf /tmp/graphene-80*/

ここでは、末尾は名前がパターンと一致するディレクトリ(またはディレクトリへのシンボリックリンク)のみを削除し、/ファイルなどを削除しないようにします。graphene-80*

他の場所で一致するディレクトリを見つけて/tmp削除するには(どこにいても)、次を使用します。

find /tmp -type d -name 'graphene-80*' -prune -exec rm -rf {} +

ディレクトリを削除するときにディレクトリ名をさらに表示するには、-print前に挿入します-exec

私たちが探している名前のディレクトリのテスト-type dとテストの両方です。-name 'graphene-80*'検索パスから-prune見つかったディレクトリを削除し(削除されたディレクトリ内を見たくない)、最後に次のように呼び出して-exec実際の削除を実行します。rm


コメントの質問に対する回答:「このディレクトリ内のすべてのファイルを削除するにはどうすればよいですか(ディレクトリ自体は削除しません)?」

次のいずれか:

  • ディレクトリを削除して再作成します。

    find /tmp -type d -name 'graphene-80*' -prune \
        -exec rm -rf {} \; -exec mkdir {} +
    

    あるいは、両方の操作をまとめてより効率的に実行できます。

    find /tmp -type d -name 'graphene-80*' -prune \
        -exec sh -c 'rm -rf "$@"; mkdir "$@"' sh {} +
    

    この方法の利点は、コマンドが簡単であることです(以下のコマンドと比較して)。

  • 見つかったディレクトリから名前(ファイルとディレクトリ)のみを削除するには、小さなインラインシェルスクリプトを使用します。

    find /tmp -type d -name 'graphene-80*' -prune -exec bash -O nullglob -O dotglob -c '
        for dirpath do
            rm -rf "$dirpath"/*
        done' bash {} +
    

    bashこれにより、一括検出されたディレクトリパス名を含む小さなインラインスクリプトが実行されます。シェルはシェルオプションセットnullglobで始まります。dotglobこのnullglobオプションは、一致しないシェルパターンを次に拡張します。何もない拡張されていないままにする代わりに、dotglobシェルオプションを使用して非表示の名前を一致させます(デフォルトでは非*表示の名前と一致しません)。スクリプトは指定されたディレクトリパスを繰り返し、各ディレクトリを再帰的に空にします。

    これの利点は、マウントポイントとなるディレクトリパスの検索を完全に処理できることです。欠点は、コマンドが複雑であり、コマンドが実行する操作を説明するためにこれらのテキストをすべて書き込む必要があるという事実です(これは、次の人がスクリプトのメンテナンスを引き継ぐのが難しいことを意味します)。

おすすめ記事