Düzgün sıralama için yüzlerce dosyayı aynı anda yeniden adlandırma


23

Ben dosyaların bir ton gibi tüm adlandırılmış şeyler var 1.jpg, 2.jpg, 3.jpgve böylece kadar üzerinde 1439.jpg, ancak, benim projeleri ve Alphabetizing biri ile ilgili bir sorun var. Genellikle sırayla gidecek 1.jpg, 10.jpg, 11.jpgvb.

İhtiyacım olan şey, dosyaları isimlendirmek 00001.jpgiçin bir yol 01439.jpg.

Bunu hızlı ve verimli bir şekilde nasıl yapabilirim?


Aradığın şey "doğal sıralama", belki de yardımı olur: askubuntu.com/questions/41390/…
Fabian Blechschmidt

Cevap doğrudan bir cevap değil mi? ls -v unix.stackexchange.com/questions/33909/…
WernerCD

+1 çünkü bunu yapmayı başaramadım pyrenamer.
Parto

@ FabianBlechschmidt, nautilus veya benzeri olmayan bir programda buna ihtiyacım var. Bireysel bir proje için.
Kaz Wolfe,

Bence doğal sıralama yapmayı düşündün mü? Ama anlıyorum, dosyaları yeniden adlandırmak oldukça kolay ve eğer işe
yararsa

Yanıtlar:


35

Ubuntu adında bir script ile birlikte geliyor rename. Birkaç güçlü toplu yeniden adlandırma özelliği içeren küçük bir Perl betiğidir, ancak en iyisi (bu durumda) değiştirme sırasında Perl'i çalıştırma yeteneğidir. Sonuç, gerçekten kompakt bir çözümdür:

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

Bu, buradaki diğer printfstil cevaplarına benzer, ancak hepsi bizim için ele alınmıştır. Yukarıdaki kod, 5 basamaklı bir sayı içindir (değişken sayıların başındaki sıfırlar dahil).

Bulduğu ilk sayı dizesini sıfır dolgulu sürümde arayacak ve değiştirecek ve dosya adının kalanını yalnız bırakacaktır. Bu, herhangi bir uzantı veya ön ek taşıma konusunda çok fazla endişelenmenize gerek olmadığı anlamına gelir.

Not: Bu tamamen taşınabilir değildir. Birçok dağıtım kullanmak rename.ulgelen util-linuxvarsayılan olarak paketin renameikili. Bu, man rename.ulyukarıda anlamayacağınız önemli ölçüde bodur bir alternatiftir (bkz. ). Bunu Perl'in adını değiştirmeyen bir platformda yapmak istiyorsanız, ilk önce onu nasıl kuracağınızı öğrenin.


Ve işte bir test demeti:

$ 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

Ve bir örnek önek (farklı bir şey yapmıyoruz):

$ 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

Eğer bir Perl insanı olsaydım bu mükemmel bir çözüm olurdu. Gerçekten temiz.
MGP

2
Herhangi bir perl kullanmıyor, sadece zaten perl ile yazılmış bir araç.
Rob,

1
Bu durumda does tek Perl komut içerir ama tam olarak ağır kaldırma değil. sprintfPerl sprintf, diğer dillerde benzer şekilde davranır .
Oli

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

Düzenle

Açıklama:

  • if [[ $f =~ [0-9]+\. ]] Yalnızca adları sayı olan (nokta işaretli) dosyaların yeniden adlandırıldığından emin olur.
  • printf "%.5d" NUMBER baştaki sıfırları ekler
  • "${f%.*}" uzantıyı keser (.jpg) ve sadece sayıyı bırakır
  • .jpgİkinci backtick sonra tekrar dosya uzantısını ekler.

Bunun yalnızca sayı olan dosya adlarında işe yarayacağını unutmayın. Sol doldurma, numaralandırılmamış dosyalara giden sıfırlar için farklı formatlar gerekir.

Deneme yapmak istiyorsanız şu komutu deneyin:

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

Düzenle 2

Yalnızca sayı olan dosya adlarının yeniden adlandırıldığından emin olarak komutu daha güvenli hale getirin. 00001.jpg adlı bir önceden var olan dosyaların üzerine yazılacağını unutmayın.


Bu bir liner betiği Ubuntu ve diğer Linux dağıtımlarında 'kutudan çıktı'!
Per

6

Bir python betiğinin altında.

Komut, tanımlanmış basamak sayısına kadar baştaki sıfırları ekler. Eğer isim bundan daha büyükse, dosyaya (isim) dokunulmaz.

Farklı uzantıları bir yeniden adlandırma eyleminde birleştirmek bazı kolaylıklar sağlayabilir. Uzantı eklemek için bunları basitçe demete ekleyin extensions = (".jpg", ".jpeg", ".tiff").

Metni boş bir dosyaya kopyalayın, farklı kaydedin rename.py, dosya dizinine ( sourcedir) doğru yolu , yeni adların ( number_ofdigits) olmasını istediğiniz basamak sayısını ( ) ve yeniden adlandırılmasını ( extensions) istediğiniz dosya uzantısını girin.

Komutu ile çalıştırın:

python3 /path/to/script/rename.py

Senaryo:

#!/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)

Düzenle:

Biraz geliştirilmiş bir sürümün altında. Dizindeki en uzun adı otomatik olarak belirler ve en uzun adın uzunluğuna kadar baştaki sıfırları ekler.

örnek:

1.jpg
12.jpg
123.jpg

dönüşür:

001.jpg
012.jpg
123.jpg

Rakam sayısını ayarlamanıza gerek yok.

#!/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'de uygulanan ve bunu çok kolaylaştıran bir yeniden adlandırma programı var:

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

İlk argüman, her dosya adı için değerlendirilen bir Perl ifadesidir.


0

Bunu depolarda bulunan pyRenamer adlı yapacak bir GUI var. Kur, başlat, dizini seç ve sadece 'Desenler' sekmesinde 'Yeniden adlandırılmış dosya adı kalıbı' nı '{num5}' olarak ayarlayın ve 'Yeniden Adlandır' düğmesini tıklayın. Yeniden adlandırmadan önce ne olacağını da önizleyebilirsiniz.


Cevabınız işe yarıyor, lütfen bunun bir shell-scriptingbölüm olduğunu unutmayın , yani bir komut satırı cevabı arıyorum. Ayrıca program hakkında daha ayrıntılı bilgi verebilir misiniz? Örneğin, hangi desen formatıdır {num5}?
Kaz Wolfe,

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

Bu çok kaba, çünkü yeniden isimlendirmeyi akıllıca yapmıyor, bunun için bir numara düşünmesi gerekecek. Ama bir şeyleri sıralamana yardım eder.

Güncelleme: Daha eksiksiz bir cevabınız var.


2
1439.jpg dosyasını 0001439.jpg olarak yeniden adlandırır.
Avinash Raj

Evet, biliyorum, hala sıralamada çalışması gereken ekstra sıfırlar doldurdum.
Swarnendu Biswas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.