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


54

同じベースファイル名を持つ複数のファイルがあります。1つを除くすべてを削除したい

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

保持する必要がなければ、を使用できることを知っていますrm foo.*

TLDP^、一致を否定することを示します。試行錯誤を通して、私はそれを見つけることができました

rm foo.*[^org]

私は必要なことをしますが、私は本当に構文を理解していません。

また、私のユースケースの制限ではありませんが、このパターンはfoo.oand も無視すると思いますfoo.or。どのように、どのような無視はグロブこのパターンの仕事でしょうないことだけ foo.orgのように見えますか?


1
@glen答えに加えとして、それは言及する価値があるrm foo.*[^org]すべてのファイル削除し、最後の文字がどちらもされていないorまたはg、そのfoo.fooいずれかと一致しませんが。
jimmij

を使用していRegular Expressionます。グループ化文字に注意する必要があります。ブラケットを使用することにより、あなたは文字で拡張子を持っていたすべてのファイルを削除してしまうことを意味文字クラスを指定したorまたはg任意の順序インチ 括弧を使用してグループを作成し、文字の順序を保持します。
マスカロ氏14年

3
@ jbarker2160-これは実際には正規表現ではなく、グロブ(またはファイル名パターン)と呼ばれますが、これは多かれ少なかれ正規表現のサブセットです-詳細については、bashのマンページのパターン一致セクションを参照してください。彼のパターンfoo.*[^org]foo.、ドットの後の1つ以上の文字で始まり、最後の文字がo、r、またはg でないファイル名と一致します。したがって、一致foo.orbしますが、foo.orgor foo.orまたはor は一致しませんfoo.o。GlennJackmanの答えは、拡張パターンマッチング機能を有効にして一致を無効にする方法を示しています。
ジョニー14年

回答:


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

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

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


私はそれが動作しないブラケット使用した場合、ブラケットと、明らかが、同じことをやってみました
ドナート

4
複数のファイル名に一致する構文は何ですか?.org、.png、.txtを除外するとしますか?
フリード

@Freedo @()パターンリストのために:stackoverflow.com/a/217208/3779853
phil294

23

bashでは、を使用することもできますGLOBIGNORE="*.org"; rm -i foo*

そしてunset GLOBIGNORE完了したら。

それは本当に良いですがshopt -s extglob、覚えている方が簡単です。


5
@Ruslanそれは動作しません。あなたがすべき( GLOBIGNORE="*.org"; rm -i foo* )
DBedrenko

3
注無視のリストを展開したい場合は、のようなコロンと分離GLOBIGNORE="*foo*:*bar*"
phyatt

7

パイプはできますか?

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

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


1行だけで必要な場合に便利です。
Bruceskyaus

1
覚えやすく(私にとっては、このようなことを頻繁に行います)、より複雑な処理を起動できます:)
drevicko

1
ls -1すべてのファイルがgrep個別に処理されるようにするために、より信頼性が高い必要があります
MichaelChirico

0

OPは非常に近かった:

rm foo.*[^o][^r][^g]

ただし、この場合*は不要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.