У меня есть каталог, который содержит файлы изображений с такими именами, как
image1.jpg
image2.jpg
image3.jpg
...
К сожалению, имена изображений должны быть на основе нуля, так image1.jpg
должно быть image0.jpg
, image2.jpg
должно быть image1.jpg
и так далее.
Я могу написать сценарий для генерации таких команд mv, поместить их в сценарий оболочки, а затем выполнить их -
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Но я полагаю, что в Unix есть более удобный способ сделать это. Так что же это?
for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
)imageN.jpg
вimage0.jpg
и все готово.Ответы:
Старый добрый perl переименуйте:
[Примечание]
Номера изображений должны быть больше 0.
В случае, если изображения больше 9 и не имеют начальных 0, используйте их,
$(ls -v1 *)
чтобы избежать залипания. Предложено @arielf и замечено @Graeme.В случае сомнений используйте также
-v
для многословия и-n
для бездействия.источник
perlreref
0
в источниках.*
в конце,`ls -v1 *`
и вы будете более защищены от ударов. Это пойдет от самого низкого числа до самого высокого.Вы можете передать сгенерированные
mv
командыbash
. Так что вам не нужно копировать их в скрипт и выполнять это. Видеть:И все будет выполнено, что по трубопроводу
bash
.источник
:)
Решает проблему, так что +1.Вы можете перебрать вывод ls, это работает для вашего примера:
Вы должны быть на том же пути ваших файлов
источник
-i
или-n
с нимmv
, это предотвратит перезапись в крайних случаях.sort -V
будет лучше вместо этого?sort
не будет работать, он будет показывать ,image10.jpg
прежде чемimage1.jpg
что может быть проблемой. Вам нужно,sort -nk 1.8
как в ответе @ Грэм.sort -V
хорошая идея, добавлю ее в мой ответ. Однако могут быть и другие крайние случаи, просто хороший совет - добавлять подобные варианты с такими вопросами на тот случай, если кто-то копирует и в итоге наносит какой-то ущерб.Следующее, кажется, работает для всего, что соответствует шаблону
imageNUMBER.jpg
. Я поместилecho
передmv
командой, чтобы сначала показать, что команда будет делать; чтобы фактически выполнить переименование, просто удалитеecho
В первой строке
ls image*.jpg|sort -V
файлы JPG будут перечислены с возрастающими номерами в имени файла.x=
Линия извлекает номер из файла. Затемy=
строка уменьшает число на единицу. Имя входного файла иy
номер затем используются вmv
команде, где-i
флаг уведомит вас перед перезаписью файла.Для моего собственного маленького теста это вывело:
Лично я бы предложил переименовать в другое имя файла, поскольку теперь порядок обработки файлов может иметь большое значение.
источник
-i
или-n
с нимmv
, это предотвратит перезапись в крайних случаях.sort -n
,-V
опция не существует.Использование
perl
сценарияprename
, который является символической ссылкой для переименования в дистрибутивах на основе Debian, также требует GNUfind
/sort
. Файлы располагаются в порядке возрастания, чтобы предотвратить перезапись.Удалите, как
-n
только вы уверены, что он делает то, что вы хотите. Перед этим предупредит о файлах, уже существующих. Однако, пока он показывает файлы, переименованные в порядке возрастания, не будет никаких конфликтов при запуске по-настоящему.источник
С
zsh
:(удалить,
-n
когда счастлив).(n)
сортировать список по номерам, поэтомуimage9.jpg
переименовывается раньшеimage10.jpg
.источник