Toplu yeniden adlandırma, * nix sürümü


11

* Nix (ayrı ayrı Ubuntu ve FreeBSD) kullanmam dışında, buna benzer (Windows ile ilgili bir soru) çok sayıda benzer adlandırılmış dosyayı yeniden adlandırmanın bir yolunu arıyordum . Özetlemek gerekirse, kabuğunu (Bash, CSH, vb.) Kullanırken, örneğin aşağıdaki dosyaları da içeren bir dizi dosyayı nasıl yeniden adlandırabilirim:

Beethoven - Kürk Elise.mp3
Beethoven - Mehtap Sonata.mp3
Beethoven - Joy.mp3 Ode
Beethoven - Kayıp Penny.mp3 Üzerinden Öfke

bunlar gibi yeniden adlandırılacak mı?

Kürk Elise.mp3
Ayışığı Sonata.mp3
Ode to Joy.mp3 Öfkeli
Kayıp Penny.mp3

Bunu yapmak istememin nedeni, bu dosya koleksiyonunun "Beethoven" (yani dosya adlarının öneki) adında bir dizine girmesi ve dosya adı üzerinde bu bilginin bulunması fazlalık olması.

Yanıtlar:


12

Rename yardımcı programı ne istersen onu yapacak.

Sadece kullan rename 's/Beethoven\ -\ //g' *.mp3


Yardımcı programa bağlantı sağlamak için lütfen düzenleme yapabilir misiniz, yoksa belirtilen her iki dağıtımda da standart mıdır (Ubuntu ve FreeBSD)?
Chris W. Rea

1
Perl ile geliyor. Debian bunu rename komutu olarak kullanıyor, bu yüzden Ubuntu'nun da yaptığını düşünüyorum. Değeri olmayan başka bir 'rename' komutu var, bu yüzden man sayfasını kontrol edin.
derobert

vay, yeniden adlandırma sözdizimi vim yerine çok benziyor: D
nXqd

/ usr / ports / sysutils / rename'deki liman FreeBSD'de mükemmel çalıştı
Josh W.

10

Linux / Unix ile pek çok şey gibi, bunu yapmanın birden fazla yolu var!

Bazıları mmv (kütle mv) kullanabilir.

Bazı Perl paketleriyle (yeni Ubuntu ve Debian) gelen rename veya prename komutu da bunu yapabilir.

prename 's/Beethoven\ -\ //g' Beethoven*.mp3

Fedora 10'daki yeniden adlandırma aracının bu programla aynı olmadığını ve farklı çalıştığını unutmayın. Farklı bir paketin parçası olan linux-ng ve burada bulunabilir .

Sık sık sadece alışkanlık dışı döngü için kabuğa giderim (tüm bu araçlar her zaman mevcut değildi sonra).

mkdir -p Beethoven
for x in Beethoven\ -\ *
do
mv "$x" Beethoven/"${x/Beethoven - /}"
done

Bu, Beethoven dizinini oluşturacak, daha sonra dosyayı, herhangi bir şeyle değiştirilen "Beethoven -" yerine bu dizine / dosya adına taşıyacaktır.

Test olarak önce:

$ ls
Beethoven - Fur Elise.mp3                 Beethoven - Ode to Joy.mp3
Beethoven - Moonlight Sonata.mp3          Beethoven - Rage Over the Lost Penny.mp3

Sonra:

$ ls Beethoven/
Fur Elise.mp3                 Ode to Joy.mp3
Moonlight Sonata.mp3          Rage Over the Lost Penny.mp3

4

Grep ve yeniden adlandırın kombinasyonu kullanılarak uygulanan bu çözümü deneyin. Bu, yeniden adlandırmanız gereken bir sürü dizinin olduğunu varsayar. Sadece birkaçı varsa, el ile yaklaşmaya giderdim, her biri için "Artist -" kalıbı yazılır.

# Rename any mp3 files in the directory hierarchy of type "a - b.mp3" to "b.mp3"
find . -name "*.mp3" -exec rename -n -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;

Açıklaması find : bulmak komutu ile tüm dosyaları bulur .mp3 geçerli dosya hiyerarşisindeki uzantısı ve argümanı çağıran -exec her biri için. -Exec içindeki {} ifadesinin , find (dosya yolu + adı) tarafından iletilen bağımsız değişkeni ifade ettiğini unutmayın . Alınan öğelerin yeniden adlandırılması ve find komutunun sonunu belirtmek yerine geçmesi sağlanır .
\;;

Yukarıda verilen komut -n (işlem yok) anahtarına sahiptir; bu nedenle, sadece çalıştırırsanız ne olacağını size söyleyecektir. Bu komutu -n anahtarı olmadan yalnızca bir kez çalıştırdıktan ve önerilen sonuçlardan memnun kaldıktan sonra çalıştırmanızı öneririm.

Şimdi regexp için.

  • ^ dizenin başlangıcıyla eşleşir.
  • $ dizenin sonuyla eşleşir.
  • . herhangi bir karakterle eşleşir.
  • *önceki yapının sıfır veya daha fazlasını ifade eder. örneğin .*, sıfır veya daha fazla karakter anlamına gelir.
  • \s herhangi bir boşluk karakterinin kısaltmasıdır.
  • \S boşluk olmayan herhangi bir karakterin kısaltmasıdır.
  • Şey içinde ()ele alır ve içinde gösterilmekte olup $1, $2kendi konumunda bağlı olarak değişir.

Regexp:

  • İsteğe bağlı bir dizin yapısını başlangıçta arar, bunu $ 1 ile yakalar: (.*/)
  • " -" Ye kadar her şeyi atlar :.*-
  • Dizenin kalan kısmını yakalar, baştaki ve sondaki boşluklar hariç, $ 2 cinsinden: (.*)
  • Dosyayı $ 1 $ 2 olarak yeniden yazar ve "/path/to/file/""filename.mp3" olmalıdır.

İşte benim test çalıştırması:

/tmp/test$ ls -R
.:
a  b  c  z-unknown.mp3

./a:
a3.mp3                 a - longer title3.mp3  c.mp3   disc2
a - longer title2.mp3  a - long title.mp3     disc 1  the band - the title.mp3

./a/disc 1:
a - title1.mp3  a - title2.mp3

./a/disc2:
a - title1.mp3  a - title2.mp3

./b:
cd - ab - title3.mp3  cd - title1.mp3  cd - title2.mp3  c.mp3

./c:
c-pony2.mp4  c - pony3.mp3  c - pony4.mp3  c-pony.mp3

/tmp/test$ find . -name "*.mp3" -exec rename -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;
./c/c-pony.mp3 renamed as ./c/pony.mp3
./c/c - pony4.mp3 renamed as ./c/pony4.mp3
./c/c - pony3.mp3 renamed as ./c/pony3.mp3
./z-unknown.mp3 renamed as ./unknown.mp3
./a/the band - the title.mp3 renamed as ./a/the title.mp3
./a/a - longer title2.mp3 renamed as ./a/longer title2.mp3
./a/a - longer title3.mp3 renamed as ./a/longer title3.mp3
./a/disc 1/a - title1.mp3 renamed as ./a/disc 1/title1.mp3
./a/disc 1/a - title2.mp3 renamed as ./a/disc 1/title2.mp3
./a/a - long title.mp3 renamed as ./a/long title.mp3
./a/disc2/a - title1.mp3 renamed as ./a/disc2/title1.mp3
./a/disc2/a - title2.mp3 renamed as ./a/disc2/title2.mp3
./b/cd - title1.mp3 renamed as ./b/title1.mp3
./b/cd - title2.mp3 renamed as ./b/title2.mp3
./b/cd - ab - title3.mp3 renamed as ./b/title3.mp3

/tmp/test$ ls -R
.:
a  b  c  unknown.mp3

./a:
a3.mp3  c.mp3  disc 1  disc2  longer title2.mp3  longer title3.mp3  long title.mp3  the title.mp3

./a/disc 1:
title1.mp3  title2.mp3

./a/disc2:
title1.mp3  title2.mp3

./b:
c.mp3  title1.mp3  title2.mp3  title3.mp3

./c:
c-pony2.mp4  pony3.mp3  pony4.mp3  pony.mp3

Regexp'ler zor bir iştir ve onları yazarken bir sürü hata yapmıştım, bu yüzden bunun esası olmadığına dair herhangi bir girişi memnuniyetle karşılarım. Bunu test ederken epeyce bulduğumu biliyorum.


1

Dosyaları (ve dizinleri) yeniden adlandırmayı özellikle komut dosyası yapmak için kolaylaştıran bir komut satırı Java programı hazırladım. Ücretsiz ve açık kaynaktır, böylece kalbinizin içeriğine göre değiştirebilirsiniz:

RenameWand
http://renamewand.sourceforge.net/

Bazı ilgili kullanım örnekleri:

Formdaki dosyaları "<a> - <b>"ilgili dizine taşıyın "<a>":

java -jar RenameWand.jar  "<a> - <b>"  "<a>/<b>"

Dosyaları en son değiştirilen zamana göre sıralayın ve 3 basamaklı bir sayıyla yeniden adlandırın:

java -jar RenameWand.jar  "<a>"  "<3|#FT> <a>"

Dosya adının bölümlerini yeniden düzenleyin ve durumu değiştirin:

java -jar RenameWand.jar  "<album> - <artist> - <song>.<ext>" 
                          "<artist.upper> <album.title> - <song>.<ext.lower>"

1

zmv Zsh yeniden adlandırma aracı çok iyi.

# zmv "programmable rename"
# Replace spaces in filenames with a underline
zmv '* *' '$f:gs/ /_'
# Change the suffix from *.sh to *.pl
zmv -W '*.sh' '*.pl'
# lowercase/uppercase all files/directories
$ zmv '(*)' '${(L)1}' # lowercase
$ zmv '(*)' '${(U)1}' # uppercase

Burada daha fazla not var ...


0

Penguin kafaları için bu kolayca bir kabuk betiğinde veya AWK betiğinde yapılabilir. Bizim için ölümlüler sadece Midnight Commander'ı denemek isteyebilirsin. Çoğu linux dağıtımında, mc -a tipi bir kabuk istemi türündendir. Düzenli ifadeleri kullanarak dosyaları yeniden adlandırabilirsiniz. Makaleyi GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ adresinde bana yardımcı olmak için kullandım.


0

İşte basit bir komut satırı örneği. Bir sürü png dosyasının adının ortasında "beyaz" kelimesini yazdım. Dışarı çıkarmak ve sadece tek bir alt çizgi bırakmak istedim. Bu hile yaptı:

for i in *.png; do mv "$i" "${i/white/}"; done

0

Vidir kullanın ve sonra yeniden adlandırma modelini uygulamak için editör özelliklerinizi kullanın.

ADI

vidir - dizini düzenle

ÖZET

vidir [--verbose] [dizin | dosya | -] ...

AÇIKLAMA

vidir, bir metin düzenleyicideki dizinin içeriğini düzenlemeye izin verir. Dizin belirtilmemişse, geçerli dizin düzenlenir.

Bir dizini düzenlerken, dizindeki her öğe kendi numaralı satırında görünecektir. Bu sayılar vidir'in hangi öğelerin değiştirildiğini nasıl takip ettiğini gösterir. Dosyaları dizinden kaldırmak için satırları silin veya dosyaları yeniden adlandırmak için dosya adlarını düzenleyin. Ayrıca dosya adlarını değiştirmek için sayı çiftlerini de değiştirebilirsiniz.

Düzenlenecek dizin olarak "-" belirtildiyse, stdin'deki dosya adlarının bir listesini okur ve düzenleme için bunları görüntüler. Alternatif olarak, komut satırında bir dosya listesi belirtilebilir.

ÖRNEKLER

vidir vidir * .jpeg Tipik kullanımlar.

bulmak | vidir - Alt dizin içeriklerini de düzenleyin. Alt dizinleri silmek için editördeki tüm içerikleri ve alt dizini silin.

-tipi bulmak f | vidir - Geçerli dizin ve alt dizinlerin altındaki tüm dosyaları düzenler.

YAZAR

Joey Hess 2006-2010

Magnus Woldrich 2011 tarafından yapılan değişiklikler

TELİF

Telif Hakkı 2006-2011, vidir "YAZAR" lar yukarıda listelendiği gibidir.

GNU GPL kapsamında lisanslanmıştır.


0

Perl olmadan * nix üzerinde renamekullanılabilir

Bazı * nix'lerde yeniden adlandırma yoktur, bu nedenle başka bir yöntem kullanarak yeniden adlandırma yapmanız gerekir. Birkaç yıl önce, zmvburada harika olsa da mutlaka uygun olmadığını da önerdim.

Builtins ve sed komutunu kullanarak hızlıca bir kabuk betiği hazırlayabiliriz, bu da bize perl yeniden adlandırılan betiğe çok benzer bir sözdizimi verir, bazı hata işlemlerinde ustalıktan yoksun kalırken, işi halleder.

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      mv -v "$file" "$(sed $sed_pattern <<< $file)"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

kullanım

sedrename 's/Beethoven\ -\ //g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

Diyelim ki biz de hedef klasörler oluşturmak istedik ...

Burada olduğu mvgibi kullanamayacağımız klasörleri oluşturmadığından sedrename, ancak oldukça küçük bir değişiklik olduğu için onu da eklemenin iyi olacağını düşünüyorum.

Bir yardımcı program işlevine abspath(ya da mutlak yol) ihtiyacımız var, böylece yeni klasör yapısını içeren sed / rename modeli için hedef klasörleri oluşturabiliriz.

abspath () { case "$1" in
               /*)printf "%s\n" "$1";;
               *)printf "%s\n" "$PWD/$1";;
             esac; }

Bu, hedef klasörlerimizin isimlerini bilmemizi sağlayacaktır. Yeniden adlandırdığımızda, onu hedef dosya adında kullanmamız gerekecek.

# generate the rename target
target="$(sed $sed_pattern <<< $file)"

# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"

# finally move the file to the target name/folders
mv -v "$file" "$target"

İşte tam klasör farkında komut dosyası ...

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      target="$(sed $sed_pattern <<< $file)"
      mkdir -p "$(dirname $(abspath $target))"
      mv -v "$file" "$target"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

Tabii ki, belirli hedef klasörlerimiz de olmadığında hala çalışıyor.

Bütün şarkıları bir klasöre koymak istiyorsak ./Beethoven/bunu yapabiliriz:

kullanım

sedrename 's|Beethoven - |Beethoven/|g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

Bonus turu ...

Dosyaları klasörlerden tek bir klasöre taşımak için bu komut dosyasını kullanma:

Eşleştirilen tüm dosyaları toplamak ve bunları geçerli klasöre koymak istediğimizi varsayarsak, bunu yapabiliriz:

sedrename 's|.*/||' **/*.mp3

before:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

after:

./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

Sed regex desenleriyle ilgili not

Bu betiğe düzenli sed desen kuralları uygulanır, bu desenler PCRE değildir (Perl Uyumlu Düzenli İfadeler). Platformunuza bağlı olarak sed -rveya birini kullanarak, düzenli ifade sözdizimini genişletmiş olabilirsiniz sed -E.

man re_formatSed basic ve genişletilmiş regexp kalıplarının tam bir açıklaması için POSIX uyumluya bakın .

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.