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

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

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

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

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

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

111 голосов | спросил Internet man 24 AM00000030000001231 2010, 03:55:12

14 ответов


79

Если вы используете bash:

for f in *.png; do mv "$f" "${f#image}"; done
ответил W_Whalley 24 AM00000040000000431 2010, 04:09:04
75

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

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

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

  rename image '' *.png
ответил Internet man 24 AM00000040000002231 2010, 04:12:22
35

ZMV

Оболочка zsh имеет мощную команду переименования пакетов, называемую zmv.

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

autoload zmv

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

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

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

zmv -w 'image*.png' '$1.png'
ответил Internet man 24 AM00000040000002231 2010, 04:12:22
8

POSIX sh для цикла

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

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
ответил X Tian 10 FebruaryEurope/MoscowbMon, 10 Feb 2014 20:45:37 +0400000000pmMon, 10 Feb 2014 20:45:37 +040014 2014, 20:45:37
5

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

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

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

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
ответил gvkv 24 AM00000040000003631 2010, 04:56:36
3

рекурсивный

простая рекурсия, выбирая изображения * 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
ответил X Tian 10 FebruaryEurope/MoscowbMon, 10 Feb 2014 21:53:49 +0400000000pmMon, 10 Feb 2014 21:53:49 +040014 2014, 21:53:49
3

qmv

Команда qmv из 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)

ответил Volker Siegel 9 +04002014-10-09T07:12:49+04:00312014bEurope/MoscowThu, 09 Oct 2014 07:12:49 +0400 2014, 07:12:49
2

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
ответил X Tian 10 FebruaryEurope/MoscowbMon, 10 Feb 2014 20:52:54 +0400000000pmMon, 10 Feb 2014 20:52:54 +040014 2014, 20:52:54
1

Используя расширение командной оболочки оболочки :

for N in {0001..1000}; do mv "{image,}$N.png"; done
ответил αғsнιη 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 01 Sep 2017 12:06:12 +0300 2017, 12:06:12
1

Для Windows и linux этот Perl-скрипт будет работать; в этом случае:

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

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

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

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

ответил circulosmeos 1 J000000Sunday18 2018, 03:19:02
0

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

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

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

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

ответил Jahid 15 +03002015-10-15T18:32:09+03:00312015bEurope/MoscowThu, 15 Oct 2015 18:32:09 +0300 2015, 18:32:09
0

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

@patrickDurusau сказал:

  

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

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

  • Кросс-платформенная . Поддержка Windows, Mac OS X и Linux.
  • Безопасный . По проверка потенциальных конфликтов и ошибок .
  • Фильтрация файлов . Поддержка включения и исключения файлов с помощью регулярного выражения. Нет необходимости запускать команды типа 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
ответил Wei Shen 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 01 Sep 2017 11:25:39 +0300 2017, 11:25:39
-5

ls * png | while read -r f; do f2 = "` echo $ f | sed -e's /image //'`"; mv $ f $ f2; сделано

ответил Ivan P 24 AM00000040000002631 2010, 04:02:26

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132