Dalam sebuah direktori, saya memiliki banyak *.html
file. Saya ingin mengubah nama mereka semua menjadi*.txt
Bagaimana saya bisa melakukan itu? Saya menggunakan bash shell.
sumber
Dalam sebuah direktori, saya memiliki banyak *.html
file. Saya ingin mengubah nama mereka semua menjadi*.txt
Bagaimana saya bisa melakukan itu? Saya menggunakan bash shell.
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.
sumber
"${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.melakukan apa yang Anda inginkan.
sumber
Ini bekerja untuk saya di OSX dari .txt ke .txt_bak
sumber
.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
: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.
sumber
rename
program ini tidak terkait denganbash
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
sumber
Untuk Pengguna Ubuntu:
sumber
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' - '{}' \;
sumber
Ini adalah contoh dari perintah rename:
-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:
-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:
Bagian rumit di tengah adalah subtitusi Perl dengan ekspresi reguler, disorot di bawah ini:
sumber
Pertanyaan ini secara eksplisit menyebutkan Bash, tetapi jika Anda memiliki ZSH tersedia, itu cukup sederhana:
Jika Anda
zsh: command not found: zmv
menjalankannya, jalankan saja:Lalu coba lagi.
Terima kasih untuk artikel asli ini untuk tip tentang zmv.
sumber
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:
Dalam kasus OP, saya mungkin memodifikasi sedikit, hanya mengubah nama file * .txt, seperti:
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
sumber
The perintah
mmv
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: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.sumber
Coba ini
pemakaian:
sumber
Agak terlambat ke pesta. Anda bisa melakukannya dengan xargs:
Atau jika semua file Anda ada di folder tertentu
sumber
ls
. Perintah ini konyol: tidak berguna menggunakan glob denganls
, 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:
Catatan: berhati-hatilah pada ukuran ekstensi agar sama (the ???)
sumber
Bagus & sederhana!
sumber
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:
sumber
Demikian pula dengan apa yang disarankan sebelumnya, ini adalah bagaimana saya melakukannya:
Saya pertama kali divalidasi dengan
sumber
Satu baris, tanpa loop:
Contoh:
sumber
Sayangnya itu tidak sepele untuk dilakukan dengan mudah. Anda mungkin perlu sedikit sihir expr.
Hapus gema begitu Anda senang itu melakukan apa yang Anda inginkan.
Sunting:
basename
mungkin sedikit lebih mudah dibaca untuk kasus khusus ini, meskipunexpr
secara umum lebih fleksibel.sumber
Inilah yang saya gunakan untuk mengganti nama
.edge
file.blade.php
Bekerja seperti pesona.
sumber
Anda juga dapat membuat fungsi di Bash, menambahkannya ke
.bashrc
atau sesuatu, lalu menggunakannya di mana pun Anda inginkan.Pemakaian:
Sumber kode dalam fungsi: https://stackoverflow.com/a/1224786/6732111
sumber
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:Jalankan dengan
./rename.sh .old .new
.Misalnya.
./rename.sh .html .txt
sumber