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

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

この質問に基づき、

「検索」出力に基づいてディレクトリを削除する方法は?

結果の最初のフォルダだけを削除してみました。

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個のファイルを選択するには、最初のファイルのみを選択します。 -n 1

パスワード:

探す。 -fと入力してください! -name "*.gz" | xargs rm -rf{};

関連情報