グローバルマッチングからパターンを除外

グローバルマッチングからパターンを除外

私のディレクトリは次のとおりです。

$ ls
total 0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file1
-rw-r--r-- 1 user user 0 Jun 18 22:44 file2
-rw-r--r-- 1 user user 0 Jun 18 22:44 file3
-rw-r--r-- 1 user user 0 Jun 18 22:44 file4
-rw-r--r-- 1 user user 0 Jun 18 22:44 file5
-rw-r--r-- 1 user user 0 Jun 18 22:44 file6
-rw-r--r-- 1 user user 0 Jun 18 22:44 file7
-rw-r--r-- 1 user user 0 Jun 18 22:44 file8
-rw-r--r-- 1 user user 0 Jun 18 22:44 file9

file2bashワイルドカードを使用して一致させたいのですがfile6入らないようにする file3

and複数のパターンに一致する演算子を見つけることができないので、a AND b同等のDe Morganの法則を使用すればよいと思いました。!(!a OR !b)

!(!(file[2-6])|file3)

期待どおりに動作します。

$ echo !(!(file[2-6])|file3)
file2 file4 file5 file6

これを達成するためのより簡単で直接的な方法はありますか?

答え1

2つの範囲を適用できます[24-6]。ここで2は最初と4-62番目は次のようになります。

$ ls file[24-6]
file2 file4 file5 file6

他の例:

$ ls file[2356]
file2 file3 file5 file6

文書:

範囲

特別なルールがあります。 「-」で区切られた2文字は範囲を表します。 (したがって、「[A-Fa-f0-9]」は「[ABCDEFabcdef0123456789]」と同じです。)「-」を括弧の間の最初または最後の文字として使用して、文字通りの意味を含めることができます。 (「[]-]」は「]」と「-」の2文字のみと一致し、「[--0]」は「-」、「。」、「0」の3文字と一致します。 / "と一致できません。)

答え2

否定範囲:

printf '%s\n' file[!013789]

ここで述べたように:

「[」の後の最初の文字が「!」または '^' の場合、含まれていない文字が一致します。


GLOBIGNOREスキップしたいファイルに設定します。

GLOBIGNORE="file0:file1:file3:file7:file8:file9"
printf '%s\n' file*

これを見て:

GLOBIGNOREシェル変数を使用して、パターンに一致するファイル名のセットを制限できます。 GLOBIGNORE が設定されている場合、GLOBIGNORE のパターンの 1 つに一致する各一致ファイル名が一致リストから削除されます。


使用extended globbing:

shopt -s extglob
printf '%s\n' file!([013789])

拡張ワイルドカードをご覧ください。

関連情報