4

次の名前のファイルのリストがあります。

file000
file001
file002
file003
...
file1100

番号が 800 より大きく 1000 より小さいすべてのファイルを一致させるにはどうすればよいですか? Linux bash を使用しています

ありがとうございました


編集

実際、私のファイルは次のように命名 さ れ て
い ます :





したがって、最初のソリューションは正しいファイルと一致しません:(

800-999 の間の番号を持つファイルを一致させるにはどうすればよいですか?

4

5 に答える 5

5

シェルで、これを試してください:

ls file{801..999}

file801これにより、で始まり、で終わるファイルが一覧表示されますfile999

説明については、マニュアルを参照してください。

于 2012-04-08T18:28:35.990 に答える
3
*[89][0-9][0-9].enc

これは、Bashの「パス名拡張」機能(別名「グロブ」)を使用して、800〜999の数字で終わり、その後に「.enc」が続くすべてのファイルを照合します。(これは正規表現ではありません)。

たとえば、上記の式を使用すると、スクリプトでこれを行うことができます。

mv *[89][0-9][0-9].enc path/to/destination/

「cp850-1.enc」のような名前のファイルとも一致させる必要がある場合は、式を次のように変更する必要があります。

*[89][0-9][0-9]*.enc
于 2012-04-09T17:12:20.563 に答える
1

これは興味深い展開を提供しますが、ディレクトリ内の元のファイルなしではテストできません。

echo [a-z,A-Z]*{801..999}[a-z,A-Z]*.enc

括弧の両方のセットの後にアスタリスクがあるはずです。

于 2013-06-17T23:58:24.177 に答える
0

好きなのを選びな。

ls | awk -F'[^0-9]*' '800<$2&&$2<1000'  # assuming no filenames start with number

perl -le'/(\d+)/&&800<$1&&$1<1000&&print for<*>'
于 2012-04-08T19:27:09.413 に答える
0

これはあなたが望むものに近いです:

$ ls *{800..999}{,-*}.enc

ab869.enc  abc8859-14.enc  cp936-1.enc  cp936.enc

abc8859-14.enc問題は、あなたが望んでいない を拾っていることです。この場合、 egrep があなたの友達になります:

$ ls *{800..999}{,-*}.enc | egrep '[^0-9][0-9]{3}(|-.*)\.enc'

ファイルを移動またはコピーする場合は、おそらくこの式をforループでラップする必要があります (特定の状況では、for ループではなく xargs を使用できる場合があります)。

 for file in $(ls *{800..999}{,-*}.enc | egrep '[^0-9][0-9]{3}(|-.*)\.enc')
 do
      # copy abc859-14.enc to abc859-14.bak
      basefile=$(basename $file .enc)
      cp $file "$basefile.bak"
 done
于 2012-04-09T00:43:33.257 に答える