Перейменуйте файли, збільшуючи число в імені файлу


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

Іноді може бути декілька версій файлів у різних форматах (наприклад, a 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. Помістіть сценарій в інший каталог, ніж ваші зображення. У каталозі зображень повинні бути лише зображення, названі таким чином, як ви описали.


Це виглядає багатообіцяюче, я спробую це через кілька годин, коли я знову на своєму ноутбуці.
robertc

Це буде працювати лише в тому випадку, якщо ваше ім’я не буде встановлено префіксами символів, що не мають чисел
пам’яті

@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.


Я не думаю, що це точна проблема, яка щоразу перераховує всі зображення. Я просто хочу перенумерувати зображення з певної точки.
robertc

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.
robertc

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.