Jawaban:
Untuk solusi yang lebih baik (hanya dengan fungsi bash, sebagai lawan dari panggilan eksternal), lihat salah satu jawaban lainnya .
Berikut ini akan dilakukan dan tidak memerlukan sistem untuk memiliki rename
program (meskipun Anda paling sering memiliki ini pada sistem):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
EDIT: Seperti yang ditunjukkan dalam komentar, ini tidak berfungsi untuk nama file dengan spasi di dalamnya tanpa penawaran yang tepat (sekarang ditambahkan di atas). Ketika bekerja murni pada file Anda sendiri yang Anda tahu tidak memiliki spasi dalam nama file ini akan berfungsi tetapi setiap kali Anda menulis sesuatu yang dapat digunakan kembali di lain waktu, jangan lewati kutipan yang tepat.
ren *.a *.b
$()
bukan sintaks backtick warisan. Meningkatkan keterbacaan, dan membuat sintaks jauh lebih tidak ambigu ketika Anda memiliki karakter yang perlu backslash-escape untuk menjadi literal di dalam substitusi perintah dengan yang terakhir.
Jika menggunakan bash, tidak perlu untuk perintah eksternal seperti sed, basename, rename, expr, dll.
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
"${file%.*}.txt"
, tetapi ini bisa berbahaya untuk file tanpa ekstensi sama sekali.
$
di dalam kurung kurawal!
--
"operator": mv - "$ file" "$ {file% .html} .txt" Operator itu mencegah nama file yang dimulai dengan a '-' agar tidak diuraikan oleh mv sebagai argumen.
rename 's/\.html$/\.txt/' *.html
melakukan apa yang Anda inginkan.
Ini bekerja untuk saya di OSX dari .txt ke .txt_bak
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
.txt
ke .txt_bak
Anda hanya harus concatenate _bak
;)
.scss
menjadi .sass
(setelah konversi di tempat ...):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
Anda ingin menggunakan rename
:
rename -S .html .txt *.html
Ini sesuai keinginan Anda - ekstensi akan diubah dari .html
menjadi .txt
untuk semua file yang cocok *.html
.
Catatan: Greg Hewgill dengan benar menunjukkan ini bukan bash bawaan; dan merupakan perintah Linux yang terpisah. Jika Anda hanya butuh sesuatu di Linux, ini akan berfungsi dengan baik; jika Anda membutuhkan sesuatu yang lebih lintas platform maka lihatlah salah satu jawaban lainnya.
rename
program ini tidak terkait dengan bash
dan juga tidak tersedia di semua platform. Saya hanya melihatnya di Linux.
rename -S .html .text *.html
di mana -S
singkatan--subst-all
Di Mac ...
brew install rename
rename -S .html .txt *.html
Untuk Pengguna Ubuntu:
rename 's/\.html$/\.txt/' *.html
Ini adalah solusi paling licin yang saya temukan yang bekerja pada OSX dan Linux, dan itu bekerja dengan baik dengan git juga!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
dan dengan git:
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
Ini adalah contoh dari perintah rename:
rename -n ’s/\.htm$/\.html/’ *.htm
-N berarti bahwa ini merupakan percobaan dan tidak akan benar-benar mengubah file apa pun. Ini akan menampilkan daftar file yang akan diubah namanya jika Anda menghapus -n. Dalam kasus di atas, itu akan mengkonversi semua file di direktori saat ini dari ekstensi file .htm ke .html.
Jika output dari uji coba di atas tampak ok maka Anda dapat menjalankan versi final:
rename -v ’s/\.htm$/\.html/’ *.htm
-V adalah opsional, tetapi itu ide yang baik untuk memasukkannya karena itu adalah satu-satunya catatan Anda akan memiliki perubahan yang dibuat oleh perintah rename seperti yang ditunjukkan pada contoh output di bawah ini:
$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html
Bagian rumit di tengah adalah subtitusi Perl dengan ekspresi reguler, disorot di bawah ini:
rename -v ’s/\.htm$/\.html/’ *.htm
Pertanyaan ini secara eksplisit menyebutkan Bash, tetapi jika Anda memiliki ZSH tersedia, itu cukup sederhana:
zmv '(*).*' '$1.txt'
Jika Anda zsh: command not found: zmv
menjalankannya, jalankan saja:
autoload -U zmv
Lalu coba lagi.
Terima kasih untuk artikel asli ini untuk tip tentang zmv.
Setelah merayapi situs web orang lain, saya berakhir dengan ribuan file kehilangan ekstensi .html, melintasi pohon subdirektori yang luas.
Untuk mengganti nama mereka semua dalam satu pengambilan, kecuali file yang sudah memiliki ekstensi .html (kebanyakan dari mereka tidak punya sama sekali), ini bekerja untuk saya:
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
Dalam kasus OP, saya mungkin memodifikasi sedikit, hanya mengubah nama file * .txt, seperti:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
Rusak (waktu tidur!):
-iname * .txt
- Artinya HANYA mempertimbangkan file yang sudah berakhiran .txt
mv -iv "{}. {txt, html}" - Ketika find melewati {} sebagai nama file, $ {filename%. *} mengekstrak nama dasarnya tanpa ekstensi apa pun untuk membentuk parameter ke mv . bash mengambil {txt, html} untuk menulis ulang sebagai dua parameter sehingga perintah terakhir berjalan sebagai:mv -iv "filename.txt" "filename.html"
Perbaiki yang diperlukan: menangani spasi di nama file
The perintahmmv
tampaknya melakukan tugas ini sangat efisien pada sejumlah besar file (puluhan ribu dalam satu detik). Misalnya, untuk mengganti nama semua .xml
file menjadi .html
file, gunakan ini:
mmv ";*.xml" "#1#2.html"
yang ;
akan cocok jalan, yang *
akan cocok nama file, dan ini disebut sebagai #1
dan #2
dalam nama pengganti.
Jawaban berdasarkan exec
atau pipa terlalu lambat atau gagal pada sejumlah besar file.
Coba ini
rename .html .txt *.html
pemakaian:
rename [find] [replace_with] [criteria]
Agak terlambat ke pesta. Anda bisa melakukannya dengan xargs:
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
Atau jika semua file Anda ada di folder tertentu
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
ls
. Perintah ini konyol: tidak berguna menggunakan glob dengan ls
, bukannya langsung menggunakan glob. Ini akan pecah dengan nama file yang mengandung spasi, tanda kutip dan (karena kurangnya tanda kutip) karakter glob.
Ini adalah cara yang baik untuk memodifikasi beberapa ekstensi sekaligus:
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
Catatan: berhati-hatilah pada ukuran ekstensi agar sama (the ???)
Jika Anda lebih suka PERL, ada skrip PERL pendek (awalnya ditulis oleh Larry Wall, pembuat PERL) yang akan melakukan persis apa yang Anda inginkan di sini: tips.webdesign10.com/files/rename.pl.txt .
Sebagai contoh Anda, yang berikut ini harus melakukan trik:
rename.pl 's/html/txt/' *.html
Demikian pula dengan apa yang disarankan sebelumnya, ini adalah bagaimana saya melakukannya:
find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;
Saya pertama kali divalidasi dengan
find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;
Satu baris, tanpa loop:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
Contoh:
$ 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
Sayangnya itu tidak sepele untuk dilakukan dengan mudah. Anda mungkin perlu sedikit sihir expr.
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
Hapus gema begitu Anda senang itu melakukan apa yang Anda inginkan.
Sunting: basename
mungkin sedikit lebih mudah dibaca untuk kasus khusus ini, meskipun expr
secara umum lebih fleksibel.
Inilah yang saya gunakan untuk mengganti nama .edge
file.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
Bekerja seperti pesona.
Anda juga dapat membuat fungsi di Bash, menambahkannya ke .bashrc
atau sesuatu, lalu menggunakannya di mana pun Anda inginkan.
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
Pemakaian:
change-ext css scss
Sumber kode dalam fungsi: https://stackoverflow.com/a/1224786/6732111
Ganti nama ekstensi file untuk semua file di bawah direktori dan sub direktori saat ini tanpa paket lain (hanya gunakan skrip shell):
Buat skrip shell di rename.sh
bawah direktori saat ini dengan kode berikut:
#!/bin/bash
for file in $(find . -name "*$1"); do
mv "$file" "${file%$1}$2"
done
Jalankan dengan ./rename.sh .old .new
.
Misalnya. ./rename.sh .html .txt