bir dizindeki dosyaları yeniden adlandırma


2

Bir dizinde dosyalarım var. Dosya adları bir tarih zaman damgası notasyonu kullanılarak oluşturulur, dosya adları şu şekildedir:

name_YYMM.csv

Bu tür dosyaları aşağıdaki adlandırma kuralını kullanarak yeniden adlandırmak istiyorum:

name_YYYYMM.csv

Bunu yapmak için grep gibi bir komut satırı yardımcı programı kullanabilir miyim, yoksa bunu yapmak için bir bash betiği yazmam gerekip gerekmediğinden emin değilim.

Bu probun nasıl çözüleceğine dair herhangi bir yardım takdir edilecektir.

Ubuntu'da koşuyorum


1
Ubuntu yazılım merkezinde bulunan toplu dosya yeniden adlandırma programları var, bunlardan herhangi birini denediniz mi?
Tog,

Bir bash betiği olmadan nasıl yapılacağını bilmiyorum
RobotHumans

Yanıtlar:


2

Bunu yapmak için çok basit bir yol

ls name* | while read a; do mv $a `echo $a | sed s/name_/name_20/`; done

veya

ls name* | while read a; do mv $a $(echo $a | sed s/name_/name_20/); done

(geri alıntıların kullanımı amortismana tabi tutulduğundan (veya yine de okuması zorsa)

o eşleşen tüm dosyaları listeler name_o replace bulduğu her dosya için o name_ile name_20. Son bin yıldaki dosyalarla çalışıyorsanız 20 ila 19 arasında bir değişiklik yapabilirsiniz.


'isim' bir yer tutucudur. Diskimdeki dosyalar <name> _YYMM.csv olarak adlandırılır, burada <name> alfasayısal bir dizedir.
Takashi

@Takashi - <name> herhangi bir alt çizgi içermiyorsa (_) hala basittir. Sadece yerine name_için _yukarıdaki örnekte ve değiştirme ls name*ilels *.csv
Nifle

İşe yaradı! Teşekkürler. Şimdi, ... burada ne tür bir sihirle uğraştığımızı anlamaya çalışmak için;)
Takashi

1
forOlmadan bir döngü kullanmak daha iyi olurdu ls. Dosya adları içeren değişkenler (ve benzer şekilde, dosya adlarını işleyen komut değiştirme) her zaman alıntılanmalıdır.
Dennis Williamson,

1

renameSisteminizde çağrılan bir program veya Perl komut dosyası olması muhtemeldir .

İçin Perl komut sürümü:

rename 's/_/_20/' *_*.csv

İçin util-linux-ng sürümü:

rename _ _20 *_*.csv

Veya Bash kullanarak:

for f in name*; do mv "$f" "${f/_/_20}"; done

0

Zsh içinde:

autoload zmv
zmv '(*_[0-9][0-9])([0-9][0-9].csv)' '${1}20${2}'

Deseni daha az hassas hale getirebilirsiniz, örneğin '(*_??)(??.csv)'veya '(*)(??).csv'başka dosyaların eşleşmesi riski olmasa bile .

Zsh kullanmak istemiyorsanız, Dennis Williamson'ın cevabına bakınız .

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.