it-swarm-tr.com

Birden fazla dosyanın uzantısını nasıl değiştirebilirim?

Bir dosya uzantısını *.txt ila *.text. basename komutunu kullanmayı denedim, ancak birden fazla dosyayı değiştirme konusunda sorun yaşıyorum.

İşte benim kod:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

Bu hatayı alıyorum:

basename: too many arguments Try basename --help' for more information
192
afbr1201

Düz Greg'in Wiki :

 # * .Txt içindeki f için tüm * .txt'yi * .text 
 Olarak yeniden adlandırın; 
 mv - "$ f" "$ {f% .txt} .text" 
 bitti 

Ayrıca neden ls ayrıştırmamalısınız girişine bakın.

Düzenleme: basename kullanmanız gerekiyorsa, sözdiziminiz şöyle olur:

* .txt'deki f için 
; 
 mv - "$ f" "$ (basename -" $ f ".txt) .text" 
 bitti 
211
jasonwryan

Debian'daki geçerli dizindeki tüm dosya uzantılarını şu şekilde değiştirebilirim.

rename "s/oldExtension/newExtension/" *.txt

(Bu Perl rename komutudur, util-linux bir. Bakınız Debian/Ubuntu'daki yeniden adlandırma yardımcı programı, CentOS gibi diğer dağıtımlardakinden neden farklıdır? )

157
Matthias Braun
rename "s/oldExtension/newExtension/" *.txt

Yukarıdaki iyi çalışır ancak geçerli dizin ile sınırlıdır. Alt dizinlerle esnek olan aşağıdaki komutu deneyin. Tümü .txt dizin yapısı altında yeni bir uzantı ile dosyaları.

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;
31
Rahul

Burada s/oldExtension/newExtension/ İle ilgili cevaplar yanlış. s/txt/text/ Kullanırsanız, footxt.txt Öğesini footext.txt Biçimine dönüştürürsünüz, bu da istediğiniz değildir. s/.txt/.text/ Kullansanız bile, footxt.txt 'I fo.text.txt' Ya dönüştürür.

Dönemi eşleştirmek için \. Kullanmalısınız (. Herhangi bir karakterle eşleşecektir). Ve sondaki $ Satır sonu ile eşleşecek. Yalnızca bu uzantıyla tam olarak eşleşir.

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old
12
wisbucky
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
9
Prince John Wesley

@Prince John Wesley cevabına dayanarak, geçerli dizindeki tüm dosya uzantılarını ext1 Yerine ext2 Olarak değiştirmek için basit bir bash betiği. Ayrıca, yeniden adlandırılan dosyaların adlarını verir.

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

Örnek kullanım (komut dosyasının adının change-ext Olduğu varsayılarak):

change-ext ext1 ext2
8
Dennis Golomazov

Zsh'ye geçme nedeni 53:

zmv '(*).txt' '$1.text'

7
Burrito

diyelim ki dosyalarınız çeşitli dizine dağılmış, dirx'in ana dizininiz olduğu varsayılarak, find:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done
6
Arash

İşte benim işime yarayan bu:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
2
yegor256

Sen ne zaman

kaynak dosyalar için bir uzantı yok

ve hedef uzantı . text bunu şu şekilde yaparsınız -

for f in *; do mv -- "$f" "${f%.\*}.text"; done
2
nitinr708

Sürümünüzde neyin yanlış gittiğini bilmek istiyorsanız: $files onun yerine $x basename komutunda. Yani bu işe yarıyor (denenmemiş olsa da):

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
1
daniel kullmann