`find` の出力に基づいてディレクトリを削除する方法: 最初の結果のみ

`find` の出力に基づいてディレクトリを削除する方法: 最初の結果のみ

この質問に基づいて、

`find` 出力に基づいてディレクトリを削除するにはどうすればいいですか?

結果の最初のフォルダーのみを削除しようとしました:

find * -type d | head -n1 | -exec rm -rf {} \;

しかし、次のエラーが表示されます:

bash: -exec: command not found

どうしたの?

答え1

または を-quit使用した後にを使用できます。-delete-exec

-やめる
すぐに終了します。子プロセスは実行されたままになりませんが、コマンド ラインで指定されたパスはこれ以上処理されません。


コマンドの最初の結果を削除しますfind

find * -type d -exec rm -Rf {} \; -quit

または

find . ! -path . -type d -exec rm -Rf {} \; -quit

後者は隠しフォルダを見つけます。


検索出力はアルファベット順に並べない

並べ替え後の最初の結果を削除する場合:

find * -maxdepth 1 -type d -print0 | sort -z | head -zn1 | xargs -r0 rm -Rf

数値ソートの場合は を使用しますsort -zn

答え2

pLumoはいくつかの優れた代替ソリューションを適切に提供している彼らの答えの中で私は全く異なるアプローチを提供しています。

このコマンドは、トップレベルの検索パスを記述するfind際に使用する方法で、実際には次の目的でのみ使用されます。**展開すると次のようになる名前の最初のディレクトリを見つける

シェル ループを使用してこれを行うこともできます。これにより、コードが読みやすくなり、動作がわかりやすくなります。

shopt -s dotglob nullglob

for name in *; do
    if [ -d "$name" ] && [ ! -h "$name" ]; then
        rm -rf -- "$name"
        break
    fi
done

このループは、シェルで実行されていると想定しておりbash、一致するすべての名前*(隠し名前を含む) を反復処理します。ループの本体では、現在の名前がディレクトリであるかどうか (ディレクトリへのシンボリック リンクではない) をテストし、ディレクトリである場合は、ループを終了する前にディレクトリを再帰的に削除します。

zshシェルでは、より簡単なコマンドで同様の効果が得られます。

rm -rf -- *(D/[1])

これにより、に展開される最初のディレクトリが削除されます*。グロビング修飾子は、(D/[1])の一致を*ディレクトリ ( /) のみに制限しますが、隠し名前 ( D) も含め、最初に一致する名前 ( [1]) のみを返します。現在のディレクトリにディレクトリがない場合、シェルから「一致するものが見つかりません」というエラー メッセージが表示されます。

答え3

これは非常に危険に思えますが、試してみることができます:

find * -type d | head -n1 | xargs rm -rf

答え4

私の場合はこのコードが機能しました:

  • -type fのファイルのみを検索します。
  • 「.gz」を含まないファイルをフィルタリングする
  • この場合、N 個のファイルを選択します (最初の 1 つだけ -n 1)

コード:

find . -type f ! -name "*.gz" | head -n 1 | xargs rm -rf {} ;

関連情報