rm *.sh
を使って.shで終わるファイルを削除するのは簡単で分かりやすいです。あなたは本当に、その出力内のすべてのファイルを削除したい場合は現在のディレクトリ内の特定のパターンと一致しないファイルを削除するにはどうすればよいですか?
find . -mindepth 1 -maxdepth 1 ! -name '*.jar' | sort
:しかし、どのように私はrm * -except *.jar
rm *.sh
を使って.shで終わるファイルを削除するのは簡単で分かりやすいです。あなたは本当に、その出力内のすべてのファイルを削除したい場合は現在のディレクトリ内の特定のパターンと一致しないファイルを削除するにはどうすればよいですか?
find . -mindepth 1 -maxdepth 1 ! -name '*.jar' | sort
:しかし、どのように私はrm * -except *.jar
よう.jar
なもので終わらない、現在のディレクトリ内のすべてのファイルがこれを試してみてください削除します、do do just do
find . -mindepth 1 -maxdepth 1 ! -name '*.jar' -delete
この本当に強力なツールの詳細については、find(1)マニュアルページを参照してください。
編集:ここ
-deleteフラグが唯一GNUで発見されたので、4.2.3(SiegeXで指摘したように)>を見つけるには、また、我々は、削除しようとしていないことを確認した、選択肢のカップルですディレクトリ:
find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 -r rm -f
-r xargsのフラグはGNUの拡張であるので、これはクリーン(それは*のBSD上で動作します)もう少しポータブルですが、ない:最後として
find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 rm -f
- しかし、ほとんどのポート
find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -exec rm '{}' ';'
これは、ファイルごとにrmを個別に呼び出すと、かなり遅くなるという欠点があります。
'-delete'フラグが標準ではないようです。 '-exec rm {} \;'または '-exec rm {} +'に変更することをお勧めします。しかし、この作業に 'find'を使用するのは、スレッジハンマーを使ってナットをクラックさせるようなものです。シェルの 'extglob'オプションを使用して私の答えを見てください。 – SiegeX
@SiegeX - もちろん、extglobは非標準(bashのみ)であり、 'ls'は空白に問題があるので、' find'は唯一の移植可能な方法です知っている)それを行う。 –
xargsにパイプするのではなく、 '-exec rm {} +'を使うことを強くお勧めします。 [それもPOSIXです](http://www.opengroup.org/onlinepubs/009695399/utilities/find.html) – SiegeX
あなたは、拡張されたグロブextglob
オプションを有効にして、そのよう!()
の内側にあなたのパターンを置くことによってこれを行うことができます。extglob
はまた、あなたの次を与えること
shopt -s extglob;
rm !(*.jar)
注:
?()
- 0または1つのパターンに一致する*()
- 0以上のパターンに一致する@()
- マッチパターン!()
の正確に一つ - =パターンBash、ksh、zshのみです。問題は '[shell]'というタグがついているので、もし彼がBourneやCシェルを使っているなら、これはうまくいきません。 –
タグ[バッシュ]でこの質問以外のものを合わせて) – SiegeX