У меня есть много файлов в папке, названной как 00802_Bla_Aquarium_XXXXX.jpg
. Теперь мне нужно скопировать каждый 4-й файл в подпапку, говоря в selected/
.
00802_Bla_Aquarium_00020.jpg <= this one
00802_Bla_Aquarium_00021.jpg
00802_Bla_Aquarium_00022.jpg
00802_Bla_Aquarium_00023.jpg
00802_Bla_Aquarium_00024.jpg <= this one
00802_Bla_Aquarium_00025.jpg
00802_Bla_Aquarium_00026.jpg
00802_Bla_Aquarium_00027.jpg
00802_Bla_Aquarium_00028.jpg <= this one
00802_Bla_Aquarium_00029.jpg
Как мне это сделать?
ls
. См. Также stackoverflow.com/q/4553751/789593, который спрашивает о каждой второй строке.for n in $(seq -w 20 4 200); do cp "00802_..._00${n}" ...; done
Ответы:
С Zsh вы можете сделать:
POSIXly, та же идея, просто более многословно:
Поскольку эти имена не содержат пустых или подстановочных знаков, вы также можете сделать:
источник
for i do
является стандартным и на самом деле более переносимым, чемfor i; do
канонический способ зацикливания позиционных параметров.В bash - забавная возможность, которая здесь будет работать довольно хорошо:
Это, безусловно, самый короткий и самый эффективный ответ: без вложенной оболочки, без цикла, без канала, без
awk
внешнего процесса; только один ответвлениеcp
(которого вы все равно не можете избежать) и одно расширение bash-скобки и глобус (от которого вы можете избавиться в целом, поскольку знаете, сколько у вас файлов).источник
cp 00802_Bla_Aquarium_*{03..99..4}.jpg selected
если вы хотите3 mod 4
. (Я использую замечательный факт, что 100 делится на 4). Теперь о непрерывно пронумерованных файлах все остальные ответы предполагают то же самое.Просто с помощью bash вы можете сделать:
Шаблон
./*.jpg
будет заменен отсортированным по алфавиту списком имен файлов, как указано в bash man, поэтому он должен соответствовать вашей цели.источник
for
цикла может быть заменена только с этой линией:(((++n)%4)) || cp "$file" selected/
.;-)
, Проблема, однако, в том, что вы используетеcp
для каждого файла, что не очень эффективно.Если вы
ruby
установили, вы можете использовать следующую однострочную. Обратите внимание, что предполагается, что выбранный каталог существует.Он берет список всех файлов с расширением .jpg в текущем каталоге и разбивает его на списки из четырех элементов и копирует первый элемент из каждого такого списка в каталог, выбранный в текущем каталоге.
источник
Если вы знаете, что в именах файлов не будет символов новой строки, вы можете использовать:
источник
Вы можете использовать файловый менеджер с графическим интерфейсом пользователя и изменять размер границы окна, пока каждые 5 файлов не занимают строку, а затем использовать мышь, чтобы выбрать первый столбец ...
источник
Если посмотреть на stackoverflow.com/q/4553751/789593, который предлагает решение для копирования каждого второго, как упомянуто @NN, очень простое решение будет:
Это может быть не очень эффективно, так как требует дополнительного шага копирования, это должно быть очень легко сделать.
источник