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

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

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

Ответы [ 25 ]

1 голос
/ 23 сентября 2014

У меня была похожая проблема, и по этой причине я написал сценарий оболочки.Я решил опубликовать его, несмотря на то, что многие хорошие ответы уже были опубликованы, потому что я думаю, что это может быть полезно для кого-то.Не стесняйтесь улучшать это!

цифра

@ Gnutt Чтобы добиться желаемого поведения, введите:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

Если оставлена ​​опция -rРасширение будет только смоделировано (должно быть полезно для тестирования).

Опция L описывает длину целевого числа (который будет заполнен начальными нулями), также можно добавить префикс / суффиксс параметрами -p <prefix> -s <suffix>.

Если кто-то хочет, чтобы файлы были отсортированы по номерам, прежде чем они будут пронумерованы, просто удалите параметр -o modtime.

1 голос
/ 07 июня 2014

Снова используется решение Pero с небольшими изменениями, потому что find будет проходить по дереву каталогов, в котором элементы заказа хранятся в записях каталогов.Это (в основном) будет согласовано от запуска к запуску на одном и том же компьютере и, по сути, будет «порядком создания файла / каталога», если не было удалений.

Однако в некоторых случаях вам нужно получить некоторыелогический порядок, скажем, по имени, который используется в этом примере.

find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command 
1 голос
/ 24 февраля 2013

Вы также можете использовать ls

ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash
1 голос
/ 16 сентября 2015

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

a.jpg
b.JPG
c.jpeg
d.tar.gz
e

затем ls -1cr выводит в точности список выше. Затем вы можете использовать rename:

ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'

который выводит

rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)

Предупреждение «использование неинициализированного значения […]» отображается для файлов без расширения; Вы можете игнорировать это.

Удалите -n из команды rename, чтобы фактически применить переименование.

Этот ответ основан на Ответ Люка от апреля 2014 года . Он игнорирует требование Гнутта установить число ведущих нулей в зависимости от общего количества файлов.

1 голос
/ 18 марта 2018
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

переименовать -vn - удалить n для режима выключенного теста

{$ i = 1;} - запуск управлениячисло

"% 04d.jpg" - ноль счетчика управления 04 и установка расширения выхода .jpg

1 голос
/ 28 мая 2018

Мне эта комбинация ответов сработала отлично:

ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
  • ls -v помогает упорядочить 1 10 9 в правильном порядке: 1 9 10, избегая проблем с расширением имени файла с jpg JPG jpeg
  • gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' перенумерация с 4 символами и ведущими нулями.Избегая mv, я не пытаюсь случайно перезаписать все, что уже есть, случайно набрав тот же номер.
  • bash выполняет

Помните о том, что сказал @xhienne, pipingнеизвестный контент для bash является угрозой безопасности.Но это было не так для меня, поскольку я использовал свои отсканированные фотографии.

0 голосов
/ 04 января 2019

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

$ make qt5py3

$ python3 labelImg.py

0 голосов
/ 24 октября 2018

Следуйте команде, переименуйте все файлы в последовательность, а также в нижнем регистре расширение:

rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *
0 голосов
/ 12 апреля 2013

Этот скрипт будет сортировать файлы по дате создания в Mac OS Bash.Я использую его для массового переименования видео.Просто измените расширение и первую часть имени.

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash
0 голосов
/ 08 января 2018

Этот oneliner выводит список всех файлов в текущем каталоге, сортирует по метке времени создания в обратном порядке (означает, что самый старый файл находится в начале) и автоматически переименовывается с конечными нулями в соответствии с количеством файлов.Расширение файла будет сохранено.

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

Имейте в виду, что если вы столкнулись с именами файлов, вы теряете файлы.Поэтому сначала переименуйте в что-то странное, например temp001.jpg, а затем выполните в окончательное имя файла.

DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done
...