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.

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?


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

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

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
  • This does work, but I like @glenn jackman's answer better since it doesn't invoke any programming construct. – Amjith Mar 16 '12 at 20:25

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.


Would this work for you:

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.