4

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

文件000 文件 001文件
002
文件003 ... 文件1100


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

谢谢


编辑

实际上,我的文件被命名为:
ab869.enc
cp936.enc
g122345.enc
x2022.enc
abc8859-14.enc
aax5601.enc
cp936-1.enc

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

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

4

5 回答 5

5

在 shell 中,试试这个:

ls file{801..999}

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

解释见手册:

于 2012-04-08T18:28:35.990 回答
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
于 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循环中(在某些情况下,您可能可以使用 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
于 2012-04-09T00:43:33.257 回答