Dosya Adlarındaki Tüm Renkleri Terminal İle Değiştir


12

HDD'imde EXT4 ile biçimlendirilmiş bir GB değerinde müzik var. Bu dosyaları FAT biçimli bir HDD bölümüne taşımak istiyorum. Ancak, dosyalarının çoğunu taşıyamıyorum çünkü adlarında ":" var (Örneğin, operalar için "Act 2: ....."). Komut satırında tüm dosyalarımı "XXXX: XXXX" ile "XXXX-XXXX" olarak yeniden adlandırmanın bir yolu var mı?

Yanıtlar:


25

Tüm dosyalarınız tek bir dizindeyse, şunları deneyin:

rename 's|:|-|g' *

(burada * isterseniz daha kısıtlayıcı bir şeyle değiştirilebilir)

Bir dizin ağacında çok sayıda dosyanız varsa, bunu ağacın altından deneyin:

find . -name "*:*" -exec rename 's|:|-|g' {} \;

Bu seçeneği , GERÇEKTEN yapmadan ne yapması gerektiğini size bildirmesi için -nhemen ekleyebilirsiniz rename. Bu, yanlışlıkla diğer dosyalara veya kötü bir şeye basmaktan kaçınmanıza yardımcı olabilir ...


1
Tek dizin çözümü işe yarayacak, ancak dizinlerin kendilerinde: s varsa iç içe çözüm çalışmaz. Bunun nedeni find ., bir alt dizinin adının çıktısında içeriğinden önce gelir. Eğer bir dosya varsa, yani /1:/2:ilk /1:/olarak değiştirildi edilecektir /1-/. Şimdi adlandırmak edemez /1:/2:için /1-/2-çünkü /1:/2:yok.
S Prasanth

1
Dizinler için: find . -type d -readable -writable -exec rename 's|:|-|g' {} \;Ve sonra dosyalar:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;

@Christopher Adlarında iki dizin düzeyi varsa dizin komutu başarısız olur. Örneğin: / 1: / 2: / burada 2: aynı zamanda bir dizindir. Tabii ki, Ryan'ın durumunda durum böyle değilse, o zaman işe yarayacaktır.
S Prasanth

Alt dizinlerin her çoklu düzeyleri için kullanın: for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done. Direk maksimum derinliğine 20 değiştirin. yapısı. Kesin olmak zorunda değildir - daha büyük olabilir. Çok büyük bir sayıya ayarlanırsa zaman alacaktır.
S Prasanth

0

Şu anda linux makinemde değilim, bu yüzden sadece kaba bilgi verebilirim.

Linux, renamediğer girdiler, düzenli ifadeler veya normal ifadeler arasında çalışan bir komut satırı yardımcı programına sahiptir . İstediğiniz yeniden adlandırmayı elde etmek için bunu dosyalarınızda "s /: / - /" gibi bir normal ifade ile birlikte kullanabilmeniz gerekir.

Sadece güvenli olmak için, küçük gruplar halinde yapın ve / veya simülasyonla ilk test yapın (yeniden adlandır, size gerçek adlandırma olmadan dosyanın eski adını ve yeni adını veren bir bayrak içerir - önce doğrulamak için bunu kullanın)


0

Bu, python'da dosyaların aynı dizinde olması gerekmeyen durumları ele alan bir çözümdür.

import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
    for dirname in dirs:
        if ':' in dirname:
            torename.append(os.path.join(path, dirname))
    for filename in files:
        if ':' in filename:
            torename.append(os.path.join(path, filename))

print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
    torename.reverse()
    for oldname in torename:
        directory, filename = os.path.split(oldname)
        newname = os.path.join(directory, filename.replace(':', '-'))
        command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
        os.system(command)
        f = open(logfile, 'a')
        f.write(oldname + '\n')
        f.close()
else:
    print "Aborted."
  1. Bunu bir dosyaya kaydedin (diyelim) rename.py.
  2. Değişim rootdirgöz altında dıştaki dizine (izin ~ gibi kullan tam yol adı / ile başlayan. Hiçbir kestirme veya env değişkenleri). Özel karakterlerin önüne \ koymanıza gerek yok - örneğin en dıştaki dir /.../DHD'm ise rootdir = "/.../My HDD"NOT rootdir = "/.../My\ HDD"("" notlarını not edin) [Sadece python'a aşina olabileceğiniz için bu açık oluyorum. amaçlanmıştır.]
  3. logfileİstediğiniz günlük dosyasının konumunu değiştirin . Sonunda, bu dosya, ileride başvurmak üzere yeniden adlandırılan dosyaların listesini içerecektir.
  4. Arayın python rename.py.

Uyarı: Tüm GB müziği riske atmadan önce küçük bir örnek üzerinde test yapın.

Ayrıntılar: Yeniden adlandırma, en içteki dosyalardan dışa doğru gerçekleştirilir.


0

Bunun çok eski bir yazı olduğunun farkındayım. AeroGT80'in özyinelemeli çözümü çok kapsamlı, ancak oldukça yavaş. Yavaş bir sunucuda yaklaşık yarım saat çalışıyordum ve sadece yarısı tamamlandı - yaklaşık 300 alt dizinde yaklaşık 73.000 dosya olduğunu düşünüyorum.

Aşağıdaki çözüm çok daha hızlı çalışacaktır (AeroGT80'in özyinelemesiz çözümü kullanılarak her dosya yerine bir dizindeki tüm dosyalarda tek tek çalışır). Tek sorun, sadece bir dizin derin aşağı iner (bu yüzden onun çözümü gibi tamamen özyinelemeli değil), ama eminim yeterince kolayca değiştirilebilir.

#!/bin/bash
for D in *; do
        if [ -d "${D}" ]; then
                #echo "${D}"
                pushd "${D}" > /dev/null
                rename 's|:|-|g' *
                popd > /dev/null
        fi
done
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.