私のディレクトリは次のとおりです。
$ 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
file2
bashワイルドカードを使用して一致させたいのですが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-6
2番目は次のようになります。
$ 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])