Папки Copying и Renaming инкрементно

У меня есть папка по имени P1. Как я могу сделать 59 копий той папки, но именование их инкрементно, т.е. новых папок называют как P2, P3..., P60?

Вот то, что я сделал, но это не работало:
Я сделал 59 копий вручную и затем попытался переименовать их использование:

j=2;for f in /path/to/folders/*; do mv "$f" "$j"; let j=j+1; done

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

Что было неправильным с командой, которую я записал и как я могу сделать все копирование и переименование автоматически?

2
задан 15 October 2016 в 00:28

1 ответ

В вашей команде каталоги сначала переименовываются в значение 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
3
ответ дан 2 December 2019 в 02:49

Другие вопросы по тегам:

Похожие вопросы: