У меня есть папка по имени P1. Как я могу сделать 59 копий той папки, но именование их инкрементно, т.е. новых папок называют как P2, P3..., P60?
Вот то, что я сделал, но это не работало:
Я сделал 59 копий вручную и затем попытался переименовать их использование:
j=2;for f in /path/to/folders/*; do mv "$f" "$j"; let j=j+1; done
но вместо этого все мои скопированные файлы включая исходный файл были удалены из каталога.
Что было неправильным с командой, которую я записал и как я могу сделать все копирование и переименование автоматически?
В вашей команде каталоги сначала переименовываются в значение var j
, которое равно 2
, так что в итоге вы получите только одну копию с именем 2
(так как каждая перезаписывает предыдущую). После завершения этого процесса j
переназначается на j+1
(echo $j
возвращает 3
) - оно не увеличивается.
Чтобы сделать 59 копий, вы можете сделать это:
for i in {2..60}; do cp -r -- P1 P"$i"; done
{2..60}
расширяется до 2 3 4 5 6 7 вплоть до 60
Для номеров с фиксированной шириной (т. Е. 02 предшествует 11 при сортировке) используйте printf
:
for i in {2..60}; do cp -r -- P1 P$(printf %02d "$i"); done
Это дает P02
P03
P04
... P10
, P11
Для пошагового переименования вы можете сделать что-то вроде этого, предполагая, что копии не нумеруются ...
j=0; for dir in /path/to/stuff/*; do mv -v -- "$dir" "$dir""$((++j))"; done
Фиксированный формат ширины:
j=0; for dir in /path/to/stuff/*; do printf -v new "$dir%02d" "$((++j))"; mv -v -- "$dir" "$new"; done
Возможно, стоит сделать этот последний более читабельным ...
j=0
for dir in /where/my/stuff/is/*
do printf -v new "$dir%02d" "$((++j))"
mv -v -- "$dir" "$new"
done