Переименуйте файлы, увеличив число в имени файла


14

У меня есть каталог, который содержит пронумерованные файлы изображений, что-то вроде этого:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

Иногда может быть несколько версий файла в различных форматах (например. pngИ svgверсии 03и 09файлы выше) , но эти цифры иначе подряд. Обычно в каждом каталоге содержится 40-80 таких файлов. Числа соответствуют порядку, в котором эти изображения появляются в рукописи (документ Word, но это не важно). Нет другого способа определить порядок изображений.

Если я добавлю новое изображение в рукопись, мне нужно будет поместить копию изображения в этот каталог с правильной нумерацией. Поэтому, если новое изображение является пятым в рукописи, мне нужно переименовать файлы в каталоге, чтобы освободить место для него:

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

Какой самый простой способ из командной строки или из скрипта или макроса перенумеровать все файлы, начиная с определенного числа? У меня стандартная установка Fedora Linux с использованием bash.

Ответы:


11

Я думаю, что это должно сделать работу:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

Скрипт принимает один параметр - номер вашего нового изображения.

PS. Поместите скрипт в другой каталог, чем ваши изображения. В каталоге images должны быть только изображения, названные так, как вы описали.


Это выглядит многообещающе, я попробую через несколько часов, когда вернусь на свой ноутбук.
Робертc

Это будет работать только в том случае, если ваше имя файла не имеет префикса нечисловых символов
мемы

@mems ОП четко заявляет, что имена файлов начинаются с цифры
xhienne

2

Это будет проще в zsh, где вы можете использовать

  • On Глоб классификатор для сортировки матчей в порядке убывания (и nиспользовать числовой порядок, в случае , если имена файлов не все имеют ведущие нули к одной и той же ширине);
  • (l:WIDTH::FILLER:) флаг расширения параметр , чтобы дополнить все числа в одной и той же ширины (ширина большего числа).
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

В bash вот скрипт, который предполагает, что файлы дополняются до фиксированной ширины (в противном случае скрипт не будет переименовывать нужные файлы) и дополняется до фиксированной ширины (которая должна быть указана).

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

Точная проблема рассматривается в этой статье . Обратите внимание, что вам придется изменить его для поддержки форматов SVG и PNG, добавив второй шаг MV.


Я не думаю, что это точная проблема, это будет каждый раз менять нумерацию всех изображений. Я просто хочу изменить нумерацию изображений с определенной точки.
Робертc

1

Полегче:

touch file`ls file* | wc -l`.ext

Ты получишь:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

Как бы я добавил ведущий ноль для 1-9? Также помните, что может быть два файла 03.png и 03.svg.
Роберт

1

Похоже, в последнее время интерес к этому вопросу невелик, но, если кто-то наткнется на него, здесь есть три вопроса. Один из них заключается в том, как выбрать файлы для переименования на основе семантических критериев (диапазон не является лексическим и не может быть указан с помощью подстановочных знаков или даже регулярных выражений - теория автоматов говорит, что это более сложно, чем NFA). Второй - как изменить имя, изменив его часть. Третий - как избежать конфликта имен. Сценарий на Bash и во многих других языках может выполнять это конкретное преобразование, но большинству из нас не нужно писать программу каждый раз, когда мы хотим переименовать группу файлов. С моим (бесплатным и открытым исходным кодом) rene.py вы можете делать то, что вы хотите, но для избежания проблемы конфликта имен требуется два вызова. Первыйrene ?.*/#7-80 %?.* Bувеличивает все имена в диапазоне, добавляя префикс%, чтобы избежать существующих имен. Затем rene %* *удаляет этот префикс из тех файлов, которые его имеют. Я описываю это по адресу https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.