Скопируйте диапазон файлов в командной строке (ZSH / BASH)


13

У меня есть список файлов с последовательными номерами в качестве суффиксов. Я хотел бы скопировать только ряд этих файлов. Как я могу указать диапазон как часть моей команды cp.

$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*

Я хотел бы скопировать файлы из P1080275.JPG в P1080283.JPG с чем-то похожим на:

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

Есть ли способ сделать это?

Ответы:



9

Чтобы перебрать диапазон в bash:

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

Применяя то же самое в вашем случае:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done

Это работает, но мне больше нравится ответ @glenn jackman, так как он не вызывает никакой программной конструкции.
Амжит

4

Zsh, с параметром extendedglob имеет оператор globbing (сопоставление с образцом).

setopt extendedglob
echo P10802<75-83>.JPG

будет совпадать с именами файлов в текущем каталоге, которые соответствуют этому шаблону (имейте в виду, что P1080275.JPG совпадает, но P108020000000075.JPG совпадает)

С другой стороны, оператор раскрытия строки {x ... y} (поддерживаемый zsh и последними версиями bash и ksh93) расширяет строки от x до y независимо от того, какие файлы находятся в текущем каталоге.

cp P10802<75-83>.JPG ~there

скопирует соответствующие файлы, поэтому

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

Но вы получите ошибки, если, например, P1080281.JPG не существует.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.