CSV dosyasına göre dosyaları (görüntüleri) yeniden adlandırma


11

Sahip olduğum ve elde etmek istediklerim:

  1. Bir klasörde binlerce görüntü var.

  2. Aşağıdaki sütunlara sahip bir CSV dosyası var:

    A: orijinal ad B: yeniden adlandırılmış ad

    Tipik bir satır şöyle görünür:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"
    

    Alıntıları kaldırabilirim, bu bir sorun değil.

  3. Şimdi bir uygulama kullanmak veya A sütunundaki tüm resimleri arayacak ve B sütunundaki adları yeniden adlandıracak bir komut dosyası çalıştırmak istiyorum (örn. Original-1.jpg -> renamed-1.jpg).

Bazı cevaplar var, örneğin:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

Ancak, bazı komut dosyaları vardır ve tüm bu komut dosyalarının yalnızca komut dosyasını depoladığınız klasörü etkileyip etkilemediğinden emin değilim veya diskteki belirli koşulları karşılayan tüm dosyaları yeniden adlandırabilirler. Tabii ki, ikincisinden kaçınılmalıdır.

Ne arıyorum dosyaları yeniden adlandırmak ve dosyaları olan bir klasör seçmek için basit bir kılavuzdur.

Şimdiden teşekkür ederim.

Yanıtlar:


13

Bunun sizin için çalışması gerekir:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Açıklama:

  • sed 's/"//g' files.csv : tırnak işaretleri kaldır
  • IFS=, : girişi bölme ,
  • while read orig new; do ... done: Bu, her girdi satırını okuyacak, değerini $IFS(burada virgül) ayıracak ve 1. alanı $origve geri kalanı olarak kaydedecektir $new.
  • mv "$orig" "$new" : bu, dosyaları istendiği gibi yeniden adlandırır.

Dosyanız yalnızca dosya adları (gibi orig.jpg) içeriyorsa ve yol içermiyorsa (değil /home/take2/orig.jpgveya benzer), yukarıdaki komut yalnızca geçerli dizininizdeki dosyaları etkiler. Bu nedenle, cdhedef dizine bir terminal açmanız ve orada çalıştırmanız gerekir.

Önce test edin:

Bunu test etmek için, ilk önce çalıştırılmadan çalıştırılacak komutları yazdırarak kuru bir çalışma yapabilirsiniz:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 

Harika, bu daha iyi açıklanıyor. :) Sadece çalıştırmadan önce kontrol etmek için - hedef dizine cd ve bu satırı çalıştırmak veya bu satırı example.sh olarak kaydetmek ve sonra terminalden "example.sh" çalıştırmak gerekir?
take2

@ take2 sadece hattı doğrudan çalıştırabilirsiniz. Cevabı, dosyalarınızı gerçekten değiştirmeden neyin çalıştırılacağını görmek için bir yolla güncelledim, önce bunu yapmanızı tavsiye ederim.
terdon

Harika, işe yarıyor! Sadece bir şey daha - sütunların etiketlerinin ne olduğu (şu anda "orig" ve "new" oldukları) veya sadece A sütunu adlarını B sütunu adlarıyla yeniden adlandırıyor mu?
take2

@ take2 hangi etiketler? Hayır, yalnızca virgülle ayrılmış ilk alanı alır ve ikinci alan olarak yeniden adlandırır. İkiden fazla alan varsa, satırın geri kalanına yeniden adlandırılacağını unutmayın. Girdi dosyanız yayınladığınız gibi olduğu sürece beklendiği gibi çalışacaktır.
terdon

Btw. Terminal ayrıca "mv: can't stat 'orig': Böyle bir dosya veya dizin yok" görüntüler, ancak dosyayı yeniden adlandırdı.
take2
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.