Я хочу переименовать файлы в каталоге с последовательными номерами. На основании даты создания файлов.
Для примера , sadf.jpg
чтобы 0001.jpg
, wrjr3.jpg
чтобы 0002.jpg
и так далее, количество ведущих нулей в зависимости от общего количества файлов (нет необходимости в дополнительных нулей , если не требуется).
bash
rename
batch-rename
Gnutt
источник
источник
Ответы:
Попробуйте использовать цикл
let
иprintf
для заполнения:использование
-i
флага предотвращает автоматическую перезапись существующих файлов.источник
printf -v new "%04d.jpg" ${a}
чтобы поместить значение в переменную. И((a++))
работает, чтобы увеличить переменную. Кроме того, это не делает это в порядке даты создания и не минимизирует отступы, которые являются указанными OP. Однако следует отметить, что Linux / Unix не хранит дату создания.mv -- "$i" "$new"
для правильной обработки исходных имен файлов, которые начинаются с тире; как онmv
будет пытаться проанализировать такие имена файлов, как коллекции флагов.-i
должны быть включены в ответ, и примечание должно быть переписано соответственно. это будет более безопасно. :(Салон в одну строчку:
Вы можете изменить
.ext
с помощью.png
,.jpg
и т. Д.источник
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
чтобы числа были дополнены нулями-n
команду mv, чтобы предотвратить случайную перезапись файлов. Обнаружил этот трудный путь!ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
Результаты: (1) отсортированы в порядке модификации, более поздние файлы с более поздними индексами; (2) игнорирует каталоги - и не рекурсивно; (3) колодки указатели; (4) поддерживает оригинальное расширение.Мне нравится решение Гауте за его простоту, но оно имеет важный недостаток. При работе с тысячами файлов вы можете получить сообщение «список аргументов слишком длинный» ( подробнее об этом ), а во-вторых, скрипт может работать очень медленно. В моем случае, запустив примерно 36.000 файлов, скрипт переместился на ок. один предмет в секунду! Я не совсем уверен, почему это происходит, но правило, которое я получил от коллег, было «
find
твой друг» .Для подсчета предметов и построения команды использовался gawk . Обратите внимание на главное отличие. По умолчанию
find
выполняется поиск файлов в текущем каталоге и его подкаталогах, поэтому обязательно ограничивайте поиск только в текущем каталоге, если это необходимо (используйте,man find
чтобы узнать как).источник
NR
для более короткой команды.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.for
Цикл не принимает 1 секунду на файл, строго говоря. Извлечение 36 000 имен файлов из файловой системы занимает много времени, а затем проходит по ним достаточно быстро. Многие файловые системы имеют проблемы с большими каталогами, независимо от того, какие именно команды вы выполняете; но, как правило,find
будет быстрее, чем подстановочный знак оболочки, потому что он должен выбрать и отсортировать список подходящих файлов.с командой "переименовать"
или
источник
rename
(Linux Mint 13) не имеет-N
возможности.rename
команду, но я никогда не знал о-N
! Спасибо!rename
. Ссылка, размещенная @Bostrot, является еще одним инструментом переименования, и похоже, что @RomanRhrnNesterov использовал его. ¶ Всем пользователям отrename
Peder Stray и Larry Wall (пакетperl-rename
на Arch Linux и пакетrename
на Debian / Ubuntu): Вы можете определить$N
себя:perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
использование решения Pero на OSX потребовало некоторой модификации. Я использовал:
примечание: для продолжения строки есть обратная косая черта
отредактируйте 20 июля 2015: включил отзыв @ klaustopher, чтобы процитировать
\"%s\"
аргументmv
команды для поддержки имен файлов с пробелами.источник
$(rm -rf /).jpg
.mv
. Если у вас есть файл с именем, т.е.some thing.jpg
ваш сценарий не работает. Вот что я использовал:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
для работы только на jpgs в текущем каталоге, так как это лучше, чем потом сожалеть.ls -1 *.jpg
вместо поиска, иначе он не будет отсортирован. Или добавьте|sort|
перед AWKОчень простой bash one liner, который сохраняет исходные расширения, добавляет лидирующие нули, а также работает в OSX:
Упрощенная версия http://ubuntuforums.org/showthread.php?t=1355021
источник
9.ext
раньше11.ext
, но другие инструменты (напримерls
) не будут делать это тоже.Чтобы работать во всех ситуациях, поставьте \ "для файлов, в имени которых есть пробел
источник
$(rm -rf /)
все еще соблюдаются.Если ваш
rename
не поддерживает-N
, вы можете сделать что-то вроде этого:Редактировать Чтобы начать с данного числа, вы можете использовать приведенный ниже (несколько уродливый) код, просто замените 123 на желаемое число:
Это перечисляет файлы в порядке по времени создания (сначала самое новое, добавьте
-r
в ls для обратной сортировки), а затем отправляет этот список файлов для переименования. Rename использует Perl-код в регулярном выражении для форматирования и увеличения счетчика.Однако, если вы имеете дело с изображениями JPEG с информацией EXIF, я бы порекомендовал
exiftool
Это из документации exiftool , в разделе «Примеры переименования»
источник
rename
?В OSX установите скрипт переименования из Homebrew:
Тогда вы можете сделать это действительно смехотворно легко:
Или добавить хороший префикс:
источник
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Следуйте команде переименовать все файлы в последовательность, а также расширение в нижнем регистре
источник
У меня была похожая проблема, и я написал сценарий оболочки по этой причине. Я решил опубликовать его, несмотря на то, что многие хорошие ответы уже были опубликованы, потому что я думаю, что это может быть полезно для кого-то. Не стесняйтесь улучшать это!
подсчитывать
@Gnutt желаемого поведения можно добиться, набрав следующее:
Если опция
-r
не указана, расширение будет только смоделировано (должно быть полезно для тестирования).Опция L описывает длину целевого числа (которое будет заполнено начальными нулями), также возможно добавить префикс / суффикс с опциями
-p <prefix>
-s <suffix>
.Если кто-то хочет, чтобы файлы были отсортированы по номерам, прежде чем они будут пронумерованы, просто удалите эту
-o modtime
опцию.источник
источник
Предположим, у нас есть эти файлы в каталоге, указанном в порядке их создания, первый из которых самый старый:
затем
ls -1cr
выводит точно список выше. Затем вы можете использоватьrename
:какие выводы
Предупреждение «использование неинициализированного значения […]» отображается для файлов без расширения; Вы можете игнорировать это.
Удалить
-n
изrename
команды, чтобы фактически применить переименование.Этот ответ вдохновлен ответом Люка от апреля 2014 года . Он игнорирует требование Гнутта об установке числа начальных нулей в зависимости от общего количества файлов.
источник
ls -1tU
время создания. Также нужно былоrename
установить, чего у меня не было.Опять же, используя решение Pero с небольшими изменениями, потому что
find
будет проходить по дереву каталогов в порядке элементов хранятся в записях каталога. Это (в основном) будет согласованным от запуска к запуску на одном и том же компьютере и, по сути, будет «порядком создания файла / каталога», если не было удалений.Однако в некоторых случаях вам нужно получить логический порядок, скажем, по имени, который используется в этом примере.
источник
blahblah; rm -r * blahblah.jpg
?Отсортировано по времени, ограничено jpg, ведущими нулями и базовым именем (на случай, если вы, вероятно, захотите):
(все в одной строке, без
\
)источник
ls
в сценарии.переименовать -vn - удалить n для режима выключения теста
{$ i = 1;} - контрольный стартовый номер
"% 04d.jpg" - контрольный счетчик нуля 04 и установка расширения вывода .jpg
источник
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Для меня эта комбинация ответов сработала отлично:
ls -v
помогает упорядочить 1 10 9 в правильном порядке: 1 9 10, избегая проблем с расширением имени файла с jpg JPG jpeggawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
перенумерация с 4 символами и ведущими нулями. Избегая mv, я не пытаюсь случайно перезаписать все, что уже есть, случайно набрав тот же номер.bash
исполняетПомните о том, что сказал @xhienne, передача неизвестного контента в bash представляет собой угрозу безопасности. Но это было не так для меня, поскольку я использовал свои отсканированные фотографии.
источник
Вы также можете использовать ls
источник
blahblah; rm -r * blahblah.JPG
?Большинство других решений будут перезаписывать существующие файлы, уже названные как числа. Это особенно проблема, если запустить скрипт, добавить больше файлов и запустить скрипт снова.
Этот скрипт сначала переименовывает существующие числовые файлы:
источник
Этот oneliner перечисляет все файлы в текущем каталоге, сортирует по метке времени создания в обратном порядке (означает, что самый старый файл находится в начале) и автоматически переименовывается с конечными нулями в соответствии с количеством файлов. Расширение файла будет сохранено.
С годами у меня обычно есть только одна папка для фотографий и фильмов на мобильных телефонах. Применив эту команду, мои фотографии и фильмы будут готовы к слайд-шоу в правильном порядке на телевизоре или в архиве.
Имейте в виду, что если у вас есть конфликт имен файлов, вы теряете файлы. Поэтому сначала переименуйте в нечто странное,
temp001.jpg
а затем выполните в окончательное имя файла.источник
ls
не один, а два раза выглядит так, что этого лучше избегать, но я не изучал его подробно.ls
, поэтому требуются два из них. 3. Такие команды являются однократными и не предназначены для включения в сценарии, поэтому есть причина, по которой люди предпочитают однострочникиВот что сработало для меня.
Я использовал команду переименования, чтобы, если какой-либо файл содержал пробелы в его имени, команда mv не путалась между пробелами и реальным файлом.
источник
В настоящее время есть опция после выбора нескольких файлов для переименования (я видел в thunar file manager).
Приглашение приходит со всеми файлами в этом конкретном каталоге, просто проверьте с разделом категории
источник
Этот скрипт сортирует файлы по дате создания в Mac OS Bash. Я использую его для массового переименования видео. Просто измените расширение и первую часть имени.
источник
blahblah; rm -r * blahblah.mp4
?Вот еще одно решение с командой «переименовать»:
источник
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
Ответ Перо получил меня здесь :)
Я хотел переименовать файлы относительно времени, так как средства просмотра изображений не отображали изображения в порядке времени.
источник
blahblah; rm -r * blahblah.jpg
? Просто крайний пример.Если вы используете аннотатор изображений для маркировки изображений.
$ make qt5py3
$ python3 labelImg.py
источник
Чтобы перенумеровать 6000 файлов в одной папке, вы можете использовать опцию «Переименовать» программы ACDsee.
Для определения префикса используйте этот формат:
####"*"
Затем установите начальный номер и нажмите «Переименовать», и программа переименует все 6000 файлов с последовательными номерами.
источник