我有一个名为文件的列表:
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之间的数字文件吗?
*[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
在外壳,试试这个:
ls file{801..999}
这将列出开头的文件file801
和结尾file999
。
为便于说明,请参阅手册:
- http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion
这提供了一个有趣的扩展,但没有在目录中的原始文件不能进行测试。
echo [a-z,A-Z]*{801..999}[a-z,A-Z]*.enc
应该有两套括号后的星号。
随你挑。
ls | awk -F'[^0-9]*' '800<$2&&$2<1000' # assuming no filenames start with number
perl -le'/(\d+)/&&800<$1&&$1<1000&&print for<*>'
这是接近你想要什么:
$ 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