18

I have a list of files with consecutive numbers as suffixes. I would like to copy only a range of these files. How can I specify a range as part of my cp command.

$ls P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG* P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG* 

I would like to copy files from P1080275.JPG to P1080283.JPG with something similar to:

$cp P10802[75-83].JPG ~/Images/. 

Is there a way to do this?

4 Answers 4

32

You were very close. Your question was almost the correct syntax:

cp P10802{75..83}.JPG ~/Images 
0
10

To iterate over a range in bash:

for x in {0..10}; do echo $x; done 

Applying the same in your case:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done 
1
  • This does work, but I like @glenn jackman's answer better since it doesn't invoke any programming construct. Commented Mar 16, 2012 at 20:25
4

Zsh, with the extendedglob option has the globbing (pattern matching) operator.

setopt extendedglob echo P10802<75-83>.JPG 

will match filenames in the current directory that match that pattern (beware that P1080275.JPG matches but so does P108020000000075.JPG)

On the other end, the {x...y} string expansion operator (supported by zsh and recent versions of bash and ksh93), expands to the strings from x to y, regardless of what files there are in the current directory.

cp P10802<75-83>.JPG ~there 

will copy the matching files, so will

cp P10802{75..83}.JPG ~there 

But you'll get errors if for instance P1080281.JPG doesn't exist.

1

Would this work for you:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done 

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.