Linux文件名和文件通配符(Linux file names & file globbing)

2019-09-16 10:13发布

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

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之间的数字文件吗?

Answer 1:

*[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


Answer 2:

在外壳,试试这个:

ls file{801..999}

这将列出开头的文件file801和结尾file999

为便于说明,请参阅手册:

  • http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion


Answer 3:

这提供了一个有趣的扩展,但没有在目录中的原始文件不能进行测试。

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

应该有两套括号后的星号。



Answer 4:

随你挑。

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

perl -le'/(\d+)/&&800<$1&&$1<1000&&print for<*>'


Answer 5:

这是接近你想要什么:

$ 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 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


文章来源: Linux file names & file globbing