この質問に基づき、
結果の最初のフォルダだけを削除してみました。
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{};