我有一个名为的文件列表:
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之间的文件?
答案 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