it-swarm-ru.tech

Пакетное переименование файлов

У меня есть каталог, полный изображений:

image0001.png
image0002.png
image0003.png
...

И я бы хотел, чтобы их переименовали (скажем).

0001.png
0002.png
0003.png
...

Как мне это сделать?

157
Internet man

Если вы используете Bash или другую POSIX-совместимую оболочку:

for f in *.png; do
    mv -- "$f" "${f#image}"
done
110
W_Whalley

В Debian и его производных Perl rename работает аналогично sed следующим образом:

  rename -v 's/image//' *.png

Также есть rename from util-linux, который работает следующим образом:

  rename image '' *.png
113
Internet man

zMV

В оболочке zsh имеется мощная команда пакетного переименования, называемая zmv.

Сначала вам нужно включить команду zmv следующим образом (это может войти в ваш ~/.zshrc).

autoload zmv

Основной синтаксис: zmv PATTERN REPLACEMENT. Шаблон представляет собой выражение глобуса Shell. Части шаблона могут быть заключены в круглые скобки. Текст замены может содержать $1, $2 и ​​т. д. для обозначения N-й группы в скобках в шаблоне. Например:

zmv 'image(*.png)' '$1'

Вы также можете попросить Zsh автоматически определить $1, $2 и ​​т. д., чтобы соответствовать символам подстановки в шаблоне:

zmv -w 'image*.png' '$1.png'
42
Gilles 'SO- stop being evil'

Обычно я использую полезную и простую mmv ( man page ) утилиту для этого варианта использования:

$ mmv "image*.png" "#1.png"

выполню вашу задачу.

#1 в целевом шаблоне будет заменено на то, что соответствует шаблону в исходном шаблоне. Это также работает для нескольких подстановочных знаков и может использоваться, например, для изменения порядка частей имен файлов. Вы также можете легко делать более сложные вещи, такие как преобразование строчных букв в прописные.

Не забудьте защитить шаблоны от оболочки, цитируя.

34
Marcel Stimberg

POSIX ш для петли

использует sed для переименования

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
10
X Tian

Perl мне нравится так:

Perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

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

Perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
6
gvkv

qmv

Команда qmv from renameutils открывает редактор, показывающий список имен файлов с двумя столбцами, разделенными вкладкой. В каждой строке показано одно из имен файлов, одинаковое в обоих столбцах. Правый столбец представляет новые имена файлов.
Чтобы внести изменения, отредактируйте имена справа. В этом примере :%s/... или режим визуального блока полезны.

Имена файлов в вашем редакторе

$ qmv *.png

В редакторе:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Редактировать имена в правом столбце:
(Удаление префикса image из всех строк в режиме визуального блока)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Журнал переименования:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(например, Ubuntu: apt-get install renameutils)

6
Volker Siegel

рекурсивный

легко рекурсивно выбирая файлы изображений * png и предполагает, что нет необходимости иметь дело с переводом строки в именах файлов

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

Безопасно, может работать с пробелами, новыми строками, обратными слешами и всем остальным:

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done
3
X Tian

Использование расширение скобки оболочки :

for N in {0001..1000}; do mv "{image,}$N.png"; done
2
αғsнιη

Попробуйте brename ( https://github.com/shenwei356/brename ), практичный кроссплатформенный инструмент командной строки для безопасного пакетного переименования файлов/каталогов с помощью регулярных выражений (с поддержкой Windows, Linux и OS X ).

@ patrickDurusa сказал:

В Linux есть множество вариантов переименования пакетных файлов, но я не вижу каких-либо недостатков в brename, которые бросались бы на меня.

Особенности:

  • Кросс-платформенная . Поддержка Windows, Mac OS X и Linux.
  • Safe . By проверка потенциальных конфликтов и ошибок.
  • Фильтрация файлов . Поддержка включения и исключения файлов с помощью регулярного выражения. Нет необходимости запускать такие команды, как find ./ -name "*.html" -exec CMD.
  • Переименование субматча с соответствующим значением через файл значения ключа .
  • Переименование с помощью возрастающего целого числа .
  • Рекурсивное переименование файлов и каталогов .
  • Поддержка пробного запуска .
  • Красочный вывод .

Команда:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
1
Wei Shen

POSIX sh используя цикл while

Чтение имен из команды find.

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Чтение имен из файла

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
1
X Tian

Для Windows и Linux это скрипт Perl подойдет; в этом случае:

$ rnm -l 's/^image//' '*.png'

Сценарий может рекурсивно запускаться в каталогах и даже добавлять счет ко всем из них:

$ rnm -r 's/^/$counter./' '/\.png$/'

Символы UTF-8 также правильно обрабатываются как в Windows, так и в Linux.

1
circulosmeos

Вы можете использовать этот инструмент: rnm ( веб-страница )

Для вашего случая команда будет:

rnm -rs '/^image//' *.png

Вы можете найти больше примеров/документов здесь .

0
Jahid