16

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?

Amjith
  • 263
  • 1
  • 2
  • 5

4 Answers4

30

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

cp P10802{75..83}.JPG ~/Images
JonathanDavidArndt
  • 1,414
  • 3
  • 20
  • 29
glenn jackman
  • 4,320
  • 16
  • 19
9

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
quanta
  • 50,327
  • 19
  • 152
  • 213
Shyam Sundar C S
  • 1,063
  • 8
  • 12
  • 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
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.

sch
  • 560
  • 4
  • 13
1

Would this work for you:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
Janne Pikkarainen
  • 31,454
  • 4
  • 56
  • 78