Переименование файлов в папке на последовательные номера - PullRequest
197 голосов
/ 09 июля 2010

Я хочу переименовать файлы в каталоге в последовательные номера. На основе даты создания файлов.

Например, от sadf.jpg до 0001.jpg, от wrjr3.jpg до 0002.jpg и т. Д., Число ведущих нулей в зависимости от общего количества файлов (нет необходимости в дополнительных нулях, если не нужно).

Ответы [ 25 ]

274 голосов
/ 09 июля 2010

Попробуйте использовать цикл, let и printf для заполнения:

a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
  mv -i -- "$i" "$new"
  let a=a+1
done

с использованием флага -i предотвращает автоматическую перезапись существующих файлов.

201 голосов
/ 08 декабря 2015

Красота в одну строчку:

ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done 

Вы можете изменить .ext с помощью .png, .jpg и т. Д.

60 голосов
/ 14 декабря 2011

Мне нравится решение Гауте за его простоту, но оно имеет важный недостаток. При работе с тысячами файлов вы можете получить сообщение «список аргументов слишком длинный» ( больше на этом ), и, во-вторых, скрипт может работать очень медленно. В моем случае, запустив примерно 36.000 файлов, скрипт переместился на ок. один предмет в секунду! Я не совсем уверен, почему это происходит, но правило, которое я получил от коллег, было "find твой друг" .

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

Для подсчета предметов и построения команды использовалось gawk . Обратите внимание на главное отличие. По умолчанию find выполняет поиск файлов в текущем каталоге и его подкаталогах, поэтому обязательно ограничивайте поиск только в текущем каталоге, если это необходимо (используйте man find, чтобы узнать как).

28 голосов
/ 28 мая 2012

использование решения Pero на OSX потребовало некоторой модификации. Я использовал:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

примечание: для продолжения строки есть обратные слеши

редактировать 20 июля 2015 г .: включил отзыв @ klaustopher, чтобы процитировать аргумент \"%s\" команды mv для поддержки имен файлов с пробелами.

25 голосов
/ 04 февраля 2014

с командой "переименовать"

rename -N 0001 -X 's/.*/$N/' *.jpg

или

rename -N 0001 's/.*/$N.jpg/' *.jpg
24 голосов
/ 15 июня 2016

Очень простой bash one liner, который сохраняет исходные расширения, добавляет лидирующие нули, а также работает в OSX:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

Упрощенная версия http://ubuntuforums.org/showthread.php?t=1355021

11 голосов
/ 20 августа 2013

Чтобы работать во всех ситуациях, поставьте \ "для файлов с пробелами в имени

find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
8 голосов
/ 22 апреля 2014

Если ваш rename не поддерживает -N, вы можете сделать что-то вроде этого:

ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

Редактировать Чтобы начать с данного числа, вы можете использовать приведенный ниже (несколько уродливый) код, просто замените 123 на желаемое число:

ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

Здесь перечислены файлы в порядке их создания (сначала самое новое, добавьте -r в ls для обратной сортировки), затем отправьте этот список файлов для переименования. Rename использует код Perl в регулярном выражении для форматирования и увеличения счетчика.

Однако, если вы имеете дело с изображениями JPEG с информацией EXIF, я бы порекомендовал exiftool

Это из документации exiftool , в разделе "Примеры переименования"

   exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir

   Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
   preserving the original file extension (%e).  Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.
6 голосов
/ 07 июля 2017

В OSX установите сценарий переименования из Homebrew:

brew install rename

Тогда вы сможете сделать это очень просто:

rename -e 's/.*/$N.jpg/' *.jpg

Или добавитьхороший префикс:

rename -e 's/.*/photo-$N.jpg/' *.jpg
1 голос
/ 07 июля 2015
a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done
...