Linux'ta bir desene göre dosya adlarını yeniden adlandırma


1

Bunun gibi dosya adlarına sahip çok fazla veri var:

combination.2005.0801.txt
combination.2005.0802.txt 
...
combination.2005.0830. txt

Bu dosyaları böyle olacak şekilde yeniden adlandırmak istersem ne yapmalıyım?

20100801.txt  
20100802.txt
...
20100803.txt

Zaten aşağıdaki betiği kullanmaya çalıştım, ama ne yazık ki senaryo çalışmıyor.

rename 's/combination.(.*).(.*).txt/$1.txt/' *.txt

Yanıtlar:


0

(Perl uyumlu; veya daha genel, çoğu) normal ifadeleri kullanırken, .herhangi bir karakterle eşleşecek aklınızda bulundurmanız gerekir ; sadece periyotlar değil (aynı zamanda bir niceleyici olmadığı sürece sadece bir karakter).

Aşağıdakiler denenmemiş, ancak muhtemelen bu soruyu ve soruları temel alarak bu çözümü kullanmaya çalışırım :

$ for old in ./combination*.txt; do
    new=$(echo $old | sed -r 's/combination\.([[:digit:]]+)\.([[:digit:]]+)\.txt$/\\1\\2.txt/')
    mv -v "$old" "$new"
  done

Bunun test edilmediğini ve kırılabileceğini unutmayın. İlk önce her şeyi test etmek echoyerine, onu da kullanabilirsiniz mv. :)


Ben zaten bu komutu kullanmaya çalıştım. Ama sonuç:
ahmad

Ben zaten bu betiği kullanmaya çalıştım. Ancak sonuç = yeni: komut bulunamadı. Ve sonra satır 2'yi değiştirmeyi denedim (yeni = .....) boşluğu silerek (new = .....) ve komut dosyasını çalıştırdığımda sonuç = ./combination.2005.0801.txt ./combination .2005.0801.txt. Senaryonun çalışmadığı anlamına geliyor.
ahmad

Benim hatam, güncellenmiş betiği dene.
Mario

Güncellenmiş betiği kullanarak sonuç = -v ./combination.2005.0801.txt ./\1\2\.txt
ahmad

-1
$ for i in combination*.txt; do
   mv $i $(echo $i | awk -F\. '{print $2$3"."$4}'); 

done

thx, aynı saniyede düzenledik :)
savilag

Neden ve \arasında (ters eğik çizgi) ihtiyacınız olduğuna inanıyorsunuz ? -F.
Scott
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.