2010-11-23 8 views
2

rm *.shを使って.shで終わるファイルを削除するのは簡単で分かりやすいです。あなたは本当に、その出力内のすべてのファイルを削除したい場合は現在のディレクトリ内の特定のパターンと一致しないファイルを削除するにはどうすればよいですか?

find . -mindepth 1 -maxdepth 1 ! -name '*.jar' | sort 

:しかし、どのように私はrm * -except *.jar

+0

タグ[バッシュ]でこの質問以外のものを合わせて) – SiegeX

答えて

6

よう.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を個別に呼び出すと、かなり遅くなるという欠点があります。

+0

'-delete'フラグが標準ではないようです。 '-exec rm {} \;'または '-exec rm {} +'に変更することをお勧めします。しかし、この作業に 'find'を使用するのは、スレッジハンマーを使ってナットをクラックさせるようなものです。シェルの 'extglob'オプションを使用して私の答えを見てください。 – SiegeX

+0

@SiegeX - もちろん、extglobは非標準(bashのみ)であり、 'ls'は空白に問題があるので、' find'は唯一の移植可能な方法です知っている)それを行う。 –

+1

xargsにパイプするのではなく、 '-exec rm {} +'を使うことを強くお勧めします。 [それもPOSIXです](http://www.opengroup.org/onlinepubs/009695399/utilities/find.html) – SiegeX

1
echo $(ls | grep -v '.jar$') 

rm $(ls | grep -v '.jar$') 
+2

何のファイル名の一部に空白が含まれている場合は? –

+0

ええ、これはファイル名の空白にかなり重大な問題はありませんか? – thkala

+0

@Gareth:heh ...あなたはより速かった。とにかく、ファイル名に空白がある場合、これがうまくいかないことを確認しました。( – thkala

1

あなたは、拡張されたグロブextglobオプションを有効にして、そのよう!()の内側にあなたのパターンを置くことによってこれを行うことができます。extglobはまた、あなたの次を与えること

shopt -s extglob; 
rm !(*.jar) 

注:

  • ?() - 0または1つのパターンに一致する
  • *() - 0以上のパターンに一致する
  • @() - マッチパターン
  • !()の正確に一つ - =パターン
+0

Bash、ksh、zshのみです。問題は '[shell]'というタグがついているので、もし彼がBourneやCシェルを使っているなら、これはうまくいきません。 –

関連する問題