プレフィックス、数字、およびサフィックス正規表現を使用してファイル名を照合します。

プレフィックス、数字、およびサフィックス正規表現を使用してファイル名を照合します。

ファイル名を一致させるにはabc_NNN.xyz?ディレクトリの内容です

[root@ tmp]# ls -ltr
total 0
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_345.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:43 abc_def_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:44 abc_def_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:44 abc_def_345.xyz
-rw-r--r--. 1 root root 0 Jan  3 01:57 abc_123_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 01:57 abc_234_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 01:57 abc_345_345.xyz

これは私にとって効果的です

[root@ tmp]# ls -ltr abc_[0-9][0-9][0-9].xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_123.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_234.xyz
-rw-r--r--. 1 root root 0 Jan  3 00:42 abc_345.xyz

問題は、実際のシナリオでは一致する必要があるため、abc_NNNNNNNNN.xyz表現が大きすぎるということです。私は似たようなものを探していますabc_[0-9]{3}.xyzabc_[0-9]+3.xyz(明らかにこれはうまくいきません)

答え1

リストされた元のより簡単な例の場合にabc_[0-9]*.xyz機能します。明らかに、これは数値以外のものと一致しますが、リストされdefたファイルは除外されます。この場合、最初の下線は数字の後の最初の文字ではないためです。

より複雑な例では、find実際に正規表現を使用できるように展開する必要があるときです。

$ ls
abc_123_123.xyz  abc_123.xyz  abc_234_234.xyz  abc_234.xyz  abc_345_345.xyz  abc_345.xyz  abc_def_123.xyz  abc_def_234.xyz  abc_def_345.xyz
$ find . -regex '\./abc_[0-9]+\.xyz'
./abc_345.xyz
./abc_234.xyz
./abc_123.xyz

これはGNUの場合であり、find他のバリエーションはわずかに異なる場合があります。

答え2

以下を使用すると、bash拡張ワイルドカード機能を利用することもできます。

shopt -s extglob
ls abc_+([0-9]).xyz

出力例:

abc_123456.xyz
abc_123.xyz
abc_1.xyz
abc_3456.xyz
abc_345.xyz
abc_56789.xyz
abc_567.xyz

この+([0-9])式は、すべての数値の1つ以上のインスタンスと一致します。これはすべての長さの「NNNN」パターンと一致します。

答え3

で述べたようにPOSIX glob — 1 つ以上の [:digit:] を一致させる方法シェルのグロービングは正規表現と同じではありません。あなたは出力を処理するのに最もうまくいくかもしれませんlsgrepabc_[0-9]{3}.xyz

次の2つを組み合わせることができます。

[root@ tmp]# ls -ltr abc_[0-9]+.xyz | grep abc_[0-9]{3}.xyz

関連情報