2011-10-07 21 views
5

Geçerli çalışma dizinini çekecek, her dosyayı tarayacak ve bir .txt dosyası olup olmadığını kontrol edecek bir komut dosyası yazmaya çalışıyorum. Sonra her dosyayı (bu bir metin dosyası) alın ve isminin herhangi bir yerinde bir alt çizgi içerip içermediğini ve alt çizgiyi bir tireye çevirip değiştirmeyeceğini kontrol edin.Bir UNIX dizinindeki dosyaları yeniden adlandırma - kabuk betikleme

#!/bin/bash 
count=1 
while((count <= $#)) 
     do 
      case $count in 
       "*.txt") sed 's/_/-' $count 
      esac 
      ((count++)) 
done 

Ne düşünüyordum bu argümanlar olarak geçerli çalışma dizinindeki dosyaları alacağını geçerli:

Bu uzun bir sipariş, ama burada ben bugüne kadar kaba kod olduğunu biliyoruz ve her dosyayı ($ count veya "count" deki dosya ile gösterilir) kontrol edin. Sonra her dosya için, .txt ile bittiğini kontrol ederdi ve eğer yaparsa, her alt çizgi, sed kullanarak bir tireye değiştirirdi. Sahip olduğum başlıca problemlerden biri, komut dosyasının mevcut çalışma dizinindeki dosyaları okumamasıdır. Komutu komut dosyasını çalıştırdıktan sonra dizine dahil etmeye çalıştım, ancak her dosya yerine her satırın aldığını düşünüyorum (her satırda 4 veya daha fazla dosya olduğu için).

Neyse, herhangi bir yardım büyük takdir edilecektir! Ayrıca, kodumun çok kötü olduğu için üzgünüm, UNIX için çok yeni.

+0

Bir problem, '$ count'' sayısının değişkeni, yani tamsayıdır. Konumsal parametreler üzerinde yineleme yapmak isterseniz, şunu yazabilirsiniz: "$ @" içindeki dosya için; dosya için '' ya da kısa '' yapmak; –

+0

burada yapın: http: //theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html – Vijay

cevap

0
 
$ ls *.txt | while read -r file; do echo $file | 
    grep > /dev/null _ && mv $file $(echo $file | tr _ -); done 

(denenmemiş)

+0

Bu, dosya adında boşluk içeren dosyalarda başarısız olur. Eğer yanlış yaparsanız bazı verileri kaybedebilirsiniz 'mv'. –

+0

Evet, boşluk içeren dosyalarda başarısız olur. Dosya isimlerine yer açan insanlar tüm verilerini kaybetmeyi hak ediyorlar. :) –

+0

Katılıyorum ... :-) Ama biz birbirimizi öğrenmek için buradayız, bu yüzden bu yorumu ekledim. Saygılarımızla. –

1

neden olmasın: Tüm giriş çocuklar için

rename 's/_/-/' *.txt 
+0

'rename: komut bulunamadı. Soru, belirli bir Linux dağıtımı değil, Unix hakkında. Fakat Perl'in hemen hemen her yere kurulduğu düşünülürse, bu güzel ve esnek bir çözümdür. –

+2

@RolandIllig: Biliyorum 'yeniden adlandırmak' her yerde değil, ama modern bir unix benzeri sistemde idam edildiğini farz ettim. –

2
for fname in ./*_*.txt; do 
    new_fname=$(printf '%s' "$fname" | sed 's,_,-,') 
    mv "$fname" "$new_fname" 
done 
+2

Kabuk bash ise, kişi şunu yazabilir: 'new_fname = $ {fname // _/-}' –

0

teşekkürler!

ls *.txt | while read -r file; do echo file | 
    mv $file $(echo $file | sed 's,_,-,'); 
done 

Bu

Ben bitirdim gerek var ve benim amaçlar için ben boşluklar konuda çok endişeli değilim: Sonuçta, ben buldum çözümü benim beceri düzeyi için en uygun olduğunu düşünüyorum. Ama tüm harika önerileriniz için teşekkürler, hepiniz çok zekisiniz!

İlgili konular