Назад | Перейти на главную страницу

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

У меня есть список файлов с последовательными номерами в качестве суффиксов. Я хотел бы скопировать только некоторые из этих файлов. Как я могу указать диапазон как часть моей команды 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/.

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

Вы были очень близки. Ваш вопрос был почти правильным синтаксисом:

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

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

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

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

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

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

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 не существует.

Сработает ли это для вас:

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