Linux文件名&文件通配

时间:2012-04-08 18:15:36

标签: linux filenames glob

我有一个名为的文件列表:

file000
FILE001
file002
file003
...
file1100

如何匹配编号大于800但小于1000的所有文件? 我正在使用linux bash

谢谢


编辑

实际上,我的文件名称如下:
ab869.enc
cp936.enc
g122345.enc
x2022.enc
abc8859-14.enc
aax5601.enc
cp936-1.enc

所以第一个解决方案与正确的文件不匹配:(

如何匹配编号介于800-999之间的文件?

5 个答案:

答案 0 :(得分:5)

在shell中,试试这个:

ls file{801..999}

这将列出以file801开头并以file999结尾的文件。

有关说明,请参阅手册:

答案 1 :(得分:3)

*[89][0-9][0-9].enc

使用Bash的“路径名扩展”功能(又名“globbing”)来匹配所有以800到999之间的数字结尾的文件,后跟“.enc”。 (这不是正则表达式。)

例如,使用上面的表达式,您可以在脚本中执行此操作:

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

如果您还需要它来匹配名为“cp850-1.enc”的文件,那么您需要将表达式更改为:

*[89][0-9][0-9]*.enc

答案 2 :(得分:1)

这提供了一个有趣的扩展,但如果没有目录中的原始文件则无法进行测试。

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

两组括号后应该有一个星号。

答案 3 :(得分: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<*>'

答案 4 :(得分: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循环中(在某些情况下,您可能可以使用xargs而不是for循环)。

 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