Yanıtlar:
Daha iyi bir çözüm için (harici çağrıların aksine sadece bash işlevselliğiyle), diğer yanıtlardan birine bakın .
Aşağıdakiler, sistemin rename
programa sahip olmasını gerektirir ve gerektirmez (çoğunlukla bir sistemde olsa da):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
DÜZENLEME: Yorumlarda belirtildiği gibi, bu, uygun tırnak (şimdi yukarıda eklenmiştir) olmadan içindeki boşluklu dosya adları için çalışmaz. Dosya adlarında boşluk olmadığını bildiğiniz kendi dosyalarınız üzerinde çalışırken bu işe yarayacaktır, ancak daha sonra yeniden kullanılabilecek bir şey yazdığınızda, uygun alıntıyı atlamayın.
ren *.a *.b
$()
eski backtick sözdizimi yerine POSIX tarafından belirtilenleri kullanın. Okunabilirliği artırır ve ikincisi ile komut yerine tam ters eğik çizgiden kaçınması gereken karakterleriniz olduğunda sözdizimini çok daha az belirsiz hale getirir.
Bash kullanıyorsanız, sed, basename, yeniden adlandırma, ifade vb. Harici komutlara gerek yoktur.
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
"${file%.*}.txt"
, ancak bu, uzantısız dosyalar için tehlikeli olabilir.
$
Kıvırcık parantezlerin içinde hiçbir dikkat edin !
--
"operator" kullanarak : mv - "$ file" "$ {file% .html} .txt" Bu operatör ile başlayan dosya adlarını önler mv tarafından bağımsız değişken olarak ayrıştırılmasından bir '-'.
rename 's/\.html$/\.txt/' *.html
tam olarak ne istediğinizi yapar.
Bu benim için .txt'den .txt_bak'a OSX üzerinde çalıştı
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
.txt
için .txt_bak
sadece bitiştirmek zorunda _bak
;)
.scss
için .sass
(yerinde dönüşümden sonra ...):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
Kullanmak istediğiniz rename
:
rename -S .html .txt *.html
Bu tam olarak ne istediğinizi yapar - uzantısını değişecek .html
için .txt
tüm dosyaları eşleme için *.html
.
Not: Greg Hewgill, bunun bir bash yerleşik olmadığını doğru bir şekilde işaret ediyor; ve ayrı bir Linux komutudur. Linux'ta bir şeye ihtiyacınız varsa, bu iyi çalışmalıdır; daha çapraz platformda bir şeye ihtiyacınız varsa, diğer cevaplardan birine bakın.
rename
program bash
tüm platformlarla ilgili değildir ve tüm platformlarda mevcut değildir. Sadece Linux'ta gördüm.
rename -S .html .text *.html
nerede -S
açılımı--subst-all
Mac bilgisayarlarda ...
brew install rename
rename -S .html .txt *.html
Ubuntu Kullanıcıları için:
rename 's/\.html$/\.txt/' *.html
İşte rename komutunun bir örneği:
rename -n ’s/\.htm$/\.html/’ *.htm
-N, bunun bir test çalıştırması olduğu ve gerçekte herhangi bir dosyayı değiştirmeyeceği anlamına gelir. -N kaldırılırsa, yeniden adlandırılacak dosyaların bir listesini gösterir. Yukarıdaki durumda, geçerli dizindeki tüm dosyaları .htm dosya uzantısından .html'ye dönüştürür.
Yukarıdaki test çalıştırmasının çıktısı iyi görünüyorsa, son sürümü çalıştırabilirsiniz:
rename -v ’s/\.htm$/\.html/’ *.htm
-V isteğe bağlıdır, ancak eklemek için iyi bir fikirdir, çünkü aşağıdaki örnek çıktıda gösterildiği gibi yeniden adlandırma komutu tarafından yapılan değişikliklere sahip olacağınız tek kayıttır:
$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html
Ortadaki zor kısım, aşağıda vurgulanan düzenli ifadelere sahip bir Perl ikamesidir:
rename -v ’s/\.htm$/\.html/’ *.htm
Bu soru Bash'ten açıkça bahsediyor, ancak ZSH'niz varsa oldukça basittir:
zmv '(*).*' '$1.txt'
Eğer alırsanız zsh: command not found: zmv
sadece çalıştırın:
autoload -U zmv
Ve sonra tekrar deneyin.
ZMV hakkında ipucu için bu orijinal makale sayesinde.
Başkasının web sitesi tarandıktan sonra, geniş bir alt dizin ağacında .html uzantısını eksik binlerce dosya buldum.
Zaten bir .html uzantısına sahip dosyalar (çoğunda hiçbiri yoktu) hariç, hepsini tek seferde yeniden adlandırmak için, bu benim için çalıştı:
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
OP durumda ben biraz *, sadece * .txt dosyaları, bu şekilde yeniden adlandırmak için değiştirebilirsiniz:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
Bozuldu (hamam!):
-iname * .txt
- SADECE .txt ile biten dosyaları düşünün
mv -iv "{}. {txt, html}" - Bul dosya adı olarak bir {} ilettiğinde , $ {filename%. *} mv parametrelerini oluşturmak için taban adını herhangi bir uzantı olmadan ayıklar . bash , {txt, html} 'i iki parametre olarak yeniden yazmak için alır, böylece son komut şu şekilde çalışır:mv -iv "filename.txt" "filename.html"
Gereksinim duyulan düzeltme: dosya adlarındaki boşluklarla uğraşmak
Komutmmv
(saniyede on binlerce) dosyaları çok büyük sayıda çok verimli bu görevi yerine getirecek gibi görünüyor. Örneğin, tüm .xml
dosyaları dosyalara yeniden adlandırmak için şunu .html
kullanın:
mmv ";*.xml" "#1#2.html"
;
yolunu maç olacak, *
dosya adı eşleşir ve bunlar olarak adlandırılır #1
ve #2
yedek adına.
exec
Veya kanallara dayalı yanıtlar çok yavaş veya çok sayıda dosyada başarısız oldu.
Bunu dene
rename .html .txt *.html
kullanımı:
rename [find] [replace_with] [criteria]
Partiye biraz geç. Bunu xargs ile yapabilirsiniz:
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
Veya tüm dosyalarınız bir klasördeyse
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
ls
. Bu komut saçma: ls
doğrudan glob kullanmak yerine işe yaramaz bir glob kullanıyor. Bu boşluklar, tırnak işaretleri ve (tırnak eksikliğinden dolayı) glob karakterleri içeren dosya adları ile kırılacaktır.
Bu, aynı anda birden fazla uzantıyı değiştirmenin iyi bir yoludur:
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
Not: uzantı boyutunun aynı olmasına dikkat edin (???)
PERL'i tercih ederseniz, tam olarak burada istediğinizi yapacak kısa bir PERL betiği (aslında PERL'in yaratıcısı Larry Wall tarafından yazılmıştır) vardır: tips.webdesign10.com/files/rename.pl.txt .
Örneğiniz için aşağıdakiler işe yarayacaktır:
rename.pl 's/html/txt/' *.html
Daha önce önerilene benzer şekilde, ben de bunu yaptım:
find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;
Önce doğruladım
find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;
Bir satır, döngü yok:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
Misal:
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
Ne yazık ki portatif olarak yapmak önemsiz değil. Muhtemelen biraz ifade büyüsüne ihtiyacınız var.
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
Yankıyı istediğiniz gibi yaptıktan sonra mutlu edin.
Düzenleme: genel olarak daha esnek basename
olmasına rağmen, muhtemelen bu özel durum için biraz daha okunabilir expr
.
İşte .edge
dosyaları yeniden adlandırmak için kullandığım.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
Cazibe gibi çalışır.
Ayrıca Bash'te bir işlev yapabilir, ona .bashrc
veya bir şeye ekleyebilir ve daha sonra istediğiniz yerde kullanabilirsiniz.
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
Kullanımı:
change-ext css scss
İşlevdeki kodun kaynağı: https://stackoverflow.com/a/1224786/6732111
Geçerli dizin ve alt dizinler altındaki tüm dosyalar için başka paketler olmadan dosya uzantılarını yeniden adlandırın (yalnızca kabuk komut dosyasını kullanın):
rename.sh
Şu dizin altında aşağıdaki kodla bir kabuk komut dosyası oluşturun :
#!/bin/bash
for file in $(find . -name "*$1"); do
mv "$file" "${file%$1}$2"
done
Tarafından çalıştırın ./rename.sh .old .new
.
Örneğin. ./rename.sh .html .txt