Перейменування сотень файлів одночасно для належного сортування


23

У мене є тонни файлів, всі названі речі , як 1.jpg, 2.jpg, 3.jpgі так далі до 1439.jpg, однак, у мене є проблема з одним з моїх проектів і в алфавітному порядку. Це, як правило , йдуть в тому порядку 1.jpg, 10.jpg, 11.jpgі так далі.

Що мені потрібно - це якийсь спосіб назвати файли, щоб вони були у такому форматі, як 00001.jpgвесь шлях 01439.jpg.

Як я міг би зробити це швидко та ефективно?


Що ви шукаєте, це "природне сортування", можливо, це допомагає: askubuntu.com/questions/41390/…
Fabian Blechschmidt

Відповідь, що це не пряма відповідь? ls -v unix.stackexchange.com/questions/33909/…
WernerCD

+1, тому що я безуспішно намагався це зробити pyrenamer.
Парто

@FabianBlechschmidt, мені це потрібно в програмі, яка не призначена для nautilus чи подібних. Це для індивідуального проекту.
Каз Вулф

Думаю, ви задумалися про здійснення природного сортування? Але я розумію, перейменувати файли досить просто, і якщо це зробить роботу, чудово :)
Fabian Blechschmidt

Відповіді:


35

Ubuntu поставляється зі скриптом під назвою rename. Це просто невеликий сценарій Perl, який має ряд потужних функцій масового перейменування, але найкращим (у цьому випадку) є можливість запуску Perl під час заміни. В результаті виходить справді компактне рішення:

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

Це схоже на відповіді інших printfстилів, але це все для нас. Код, наведений вище, призначений для 5-значного числа (включаючи змінну кількість провідних нулів).

Він здійснить пошук та замінить перший рядковий рядок, який він знайде, з нульовою версією, а решту імені файлу залишить у спокої. Це означає, що вам не доведеться надто турбуватися про перенесення будь-якого розширення або префікса.

Примітка: це не повністю портативний. Багато дистрибутивів використовують rename.ulз util-linuxпакету як renameдвійковий код за замовчуванням . Це суттєво несподівана альтернатива (див. man rename.ul), Яка не зрозуміє сказаного. Якщо вам це подобається на платформі, яка не використовує перейменування Perl, дізнайтеся, як це встановити спочатку.


А ось тестовий джгут:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

І приклад префіксів (ми нічого не робимо):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3

Якби я людина Perl, це було б ідеальним рішенням. Дійсно акуратний.
MGP

2
Він не використовує жодної perl, а лише інструмент, який вже написаний на perl.
Роб

1
У цьому випадку він робить включати одну команду Perl , але це не зовсім важка атлетика. sprintfв Perl поводиться аналогічно sprintfв інших мовах.
Олі

21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

Редагувати

Пояснення:

  • if [[ $f =~ [0-9]+\. ]] гарантує, що перейменовані лише файли, чиї імена є цифрами (слідом за крапкою).
  • printf "%.5d" NUMBER додає провідні нулі
  • "${f%.*}" скорочує розширення (.jpg) і залишає просто число
  • .jpgпісля другого зворотного вибору знову додається розширення файлу.

Зауважте, що це буде працювати лише на імена файлів, які є числами. Наведення лівих нульових ліній для файлів, які не мають нумерації, потребує іншого формату.

Якщо ви хочете експериментувати, спробуйте цю команду:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

Редагувати 2

Зробіть команду більш безпечною, переконавшись, що перейменовані лише імена файлів, які є цифрами. Зауважте, що будь-які попередні файли з назвою 00001.jpg будуть перезаписані.


Цей скрипт для одного вкладиша працює на Ubuntu та інших дистрибутивах Linux "не в коробці"! 😃 Не потрібно встановлювати додаткових інструментів за допомогою perl, python тощо
HEXcube

6

Нижче сценарій пітона.

Сценарій додає провідні нулі до визначеної кількості цифр. Якщо назва більше, ніж це, файл (ім’я) не торкається.

Поєднання різних розширень в одній дії з перейменуванням може додати певну зручність. Щоб додати розширення, просто додайте їх до кортежу, наприклад extensions = (".jpg", ".jpeg", ".tiff").

Скопіюйте текст у порожній файл, збережіть його як rename.py, введіть правильний шлях до каталогу файлів ( sourcedir), кількість цифр, які ви хочете, щоб нові імена мали ( number_ofdigits) та розширення (файли) файлів для перейменування ( extensions)

Виконайте команду:

python3 /path/to/script/rename.py

Сценарій:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

редагувати:

Нижче трохи вдосконалена версія. Він автоматично визначає найдовше ім’я в каталозі та додає провідні нулі до довжини найдовшого імені.

приклад:

1.jpg
12.jpg
123.jpg

стає:

001.jpg
012.jpg
123.jpg

Не потрібно встановлювати кількість цифр.

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])

2

У Perl є утиліта перейменування, що робить це дуже просто:

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

Перший аргумент - це вираз Perl, який оцінюється для кожного імені файлу.


0

Існує GUI, який зробить це під назвою pyRenamer, який можна знайти у сховищах. Встановіть, запустіть, виберіть каталог і просто встановіть для «Перейменованого шаблону імені файлу» значення «{num5}» на вкладці «Шаблони» та натисніть кнопку «Перейменувати». Ви також можете переглянути, що відбудеться до перейменування.


Хоча ваша відповідь працює, зауважте, що це shell-scriptingрозділ, тобто я шукаю відповідь командного рядка. Також ви можете надати більш детальну інформацію про програму? Наприклад, який формат шаблону {num5}?
Каз Вулф

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

Це грубо, оскільки воно не робить розумно перейменування, для цього потрібно буде придумати трюк. Але це повинно допомогти вам сортувати речі.

Оновлення: ну ви маєте більш повну відповідь.


2
він перейменовує 1439.jpg як 0001439.jpg.
Авінаш Радж

Так, я знаю, лише прокладені додаткові нулі, які все ще повинні працювати з родом.
Swarnendu Biswas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.