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
シェルオプションを使用して非表示の名前を一致させます(デフォルトでは非*
表示の名前と一致しません)。スクリプトは指定されたディレクトリパスを繰り返し、各ディレクトリを再帰的に空にします。これの利点は、マウントポイントとなるディレクトリパスの検索を完全に処理できることです。欠点は、コマンドが複雑であり、コマンドが実行する操作を説明するためにこれらのテキストをすべて書き込む必要があるという事実です(これは、次の人がスクリプトのメンテナンスを引き継ぐのが難しいことを意味します)。