web-dev-qa-db-ja.com

グロブマッチから1つのパターンを除外する

同じ基本ファイル名のファイルがいくつかあります。 1つを除いてすべて削除したい

_foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
_

保持する必要がない場合は、_rm foo.*_を使用できることはわかっています。

[〜#〜] tldp [〜#〜] は、一致を否定する_^_を示しています。試行錯誤の末、

_rm foo.*[^org]
_

必要なことを行いますが、構文がよくわかりません。

また、私のユースケースの制限ではありませんが、このパターンは_foo.o_および_foo.or_も無視すると思います。このパターンはどのように機能し、only_foo.org_を無視するグロブはどのように見えますか?

64
jake
shopt -s extglob
echo rm foo.!(org)

これは「foo」です。 「org」以外のものが続く

ref: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching

63
glenn jackman

Bashでは、GLOBIGNORE="*.org"; rm -i foo*も使用できます。

完了したらunset GLOBIGNORE

shopt -s extglobほど良くはありませんが、覚えやすいと思います。

26
mivk

パイプでできる?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(明らかに、最後のチェーンでechoをrmに置き換えることをお勧めします)。

8
Adobe