it-swarm.asia

Ganti nama grup file dengan satu perintah

Jika saya memiliki sekelompok file dengan ekstensi .htm, bagaimana saya bisa mengubah nama semuanya menjadi .html?

mv *.htm *.html

tidak bekerja.

38
Richard Hoskins

Atau, Anda dapat menggunakan bash murni ... (kecuali untuk mv, yaitu ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

dan hindari hal-hal nama dasar yang tidak menyenangkan. ;)

Bash memiliki serangkaian opsi ekspansi variabel yang luas. Yang digunakan di sini, '%', menghapus akhiran pencocokan terkecil dari nilai variabel. Polanya adalah pola gabus, jadi ${file%.*} juga akan berfungsi. Operator '%%' menghilangkan akhiran pencocokan terbesar, dan dapat dipertukarkan dalam contoh di atas, karena polanya diperbaiki, ${file%%.*}.html akan mengubah a.b.htm menjadi a.html.

Lihat bagian substitusi variabel dari halaman bash untuk trik yang lebih rapi. Ada banyak yang bisa dilakukan dalam bash secara langsung.

50
falstro

rename(1) adalah utilitas Perl yang melakukan persis apa yang Anda inginkan. Pada kasus ini:

rename 's/\.htm$/.html/' *htm

atau jika Anda menggunakan sub direktori juga

(membutuhkan Bash 4.0 dan pengaturan globstar: shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm

11
TRS-80

Seharusnya tidak ada spasi, baris baru atau spasi putih di nama file, tetapi versi freiheit ini menjawabnya. Itu juga menggunakan $() bukan backticks untuk keterbacaan bersama dengan manfaat lainnya.

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

Bahkan lebih baik - untuk kasus khusus dengan menambahkan sampai akhir:

for file in *.htm
do
    mv "$file" "${file}l"
done
11
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Cobalah dengan echo di depan mv pertama kali.

Masalah dengan dokumen asli Anda adalah "mv *.htm *.html" memiliki *s ditangani oleh Shell, sehingga perintah mv hanya melihat daftar semua file .htm dan .html di direktori saat ini. Dengan kata lain, sesuatu seperti "mv foo.htm bar.htm stuff.htm six.htm file.htm". mv hanya tahu cara menangani lebih dari 2 argumen jika yang terakhir adalah direktori.

6
freiheit

Namun contoh bash murni lainnya menggunakan string replace.

for file in *.htm; do mv $file ${file/htm/html}; done

Extra - ini menggantikan semua kemunculan string

for file in *.htm; do mv $file ${file//htm/html}; done
3
xalupadas

Jika Anda menggunakan Zsh Anda dapat menggunakan 'zmv'

1
Martin

Alat terbaik adalah mmv .

mmv \*.htm #1.html

Contoh lain penggunaan (dan alat lainnya) di " Ringkasan Alat Baris Perintah GNU/Linux ".

1
bortzmeyer

Paket util-linux-ng (di Fedora) memiliki perintah rename yang mirip dengan yang disebutkan oleh TRS-8 . Anda bisa menggunakannya seperti ini:

rename .htm .html *.html
0
Cristian Ciupitu