Linux file names & file globbing

2019-06-25 11:38发布

I have a list of files named:

file000
file001
file002
file003
...
file1100

How can I match all files that have a number greater than 800 but less than 1000 ? I am using linux bash

Thank you


Edit

Actually, my files are named like:
ab869.enc
cp936.enc
g122345.enc
x2022.enc
abc8859-14.enc
aax5601.enc
cp936-1.enc

so the first solution dont match the correct files :(

How can I match files that have number between 800-999 ?

5条回答
爷的心禁止访问
2楼-- · 2019-06-25 12:29

This is close to what you want:

$ ls *{800..999}{,-*}.enc

ab869.enc  abc8859-14.enc  cp936-1.enc  cp936.enc

The trouble is that you're picking up abc8859-14.enc, which you don't want. In this case, egrep will be your friend:

$ ls *{800..999}{,-*}.enc | egrep '[^0-9][0-9]{3}(|-.*)\.enc'

If you want to move or copy files, you'll probably want to wrap this expression in a for loop (in certain circumstances, you might be able to use xargs rather than a for loop).

 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
查看更多
兄弟一词,经得起流年.
3楼-- · 2019-06-25 12:31
*[89][0-9][0-9].enc

That uses Bash's "pathname expansion" feature (aka "globbing") to match all files ending with a number between 800 and 999 followed by ".enc". (This is not a regular expression).

For example, using the above expression you can do this in your script:

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

If you need it to also match a file named like "cp850-1.enc", then you would need to change the expression to:

*[89][0-9][0-9]*.enc
查看更多
老娘就宠你
4楼-- · 2019-06-25 12:33

This provides an interesting expansion but can not be tested without the original files in a directory.

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

There should be an asterisk after both sets of brackets.

查看更多
霸刀☆藐视天下
5楼-- · 2019-06-25 12:34

Take your pick.

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

perl -le'/(\d+)/&&800<$1&&$1<1000&&print for<*>'
查看更多
倾城 Initia
6楼-- · 2019-06-25 12:37

In shell, try this:

ls file{801..999}

This will list the files starting with file801 and ending with file999.

For explanation, see the manual:

查看更多
登录 后发表回答