it-swarm-id.com

Bagaimana cara mengubah ekstensi beberapa file?

Saya ingin mengubah ekstensi file dari *.txt hingga *.text. Saya mencoba menggunakan perintah basename, tetapi saya mengalami masalah dalam mengubah lebih dari satu file.

Ini kode saya:

files=`ls -1 *.txt`

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

Saya mendapatkan kesalahan ini:

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

Langsung dari Wiki Greg :

 # Ubah nama semua * .txt menjadi * .text 
 Untuk f di * .txt; do 
 mv - "$ f" "$ {f% .txt} .text" 
 melakukan 

Lihat juga entri tentang mengapa Anda seharusnya tidak menguraikan ls .

Sunting: jika Anda harus menggunakan basename, sintaks Anda adalah:

 untuk f di * .txt; do 
 mv - "$ f" "$ (basename -" $ f ".txt) .text" 
 selesai 
211
jasonwryan

Inilah cara saya mengubah semua ekstensi file di direktori saat ini di Debian.

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

(Ini adalah perintah Perl rename, bukan util-linux satu. Lihat Mengapa utilitas penggantian nama pada Debian/Ubuntu berbeda dari yang ada di distribusi lain, seperti CentOS? )

157
Matthias Braun

Perintah sederhana, rename dari util-linux , akan melakukannya untuk Anda, itu menggantikan setiap kemunculan "txt" menjadi "teks" di semua file yang cocok dengan "* .txt":

rename txt text *.txt
43
lamwaiman1988
rename "s/oldExtension/newExtension/" *.txt

Di atas berfungsi dengan baik tetapi terbatas pada direktori saat ini. Coba perintah di bawah ini, yang fleksibel dengan sub-direktori. Itu akan mengganti nama semua .txt file dalam struktur direktori dengan ekstensi baru.

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

Jawaban di sini merujuk s/oldExtension/newExtension/ salah. Jika Anda menggunakan s/txt/text/, Anda akan mengonversi footxt.txt hingga footext.txt, yang bukan itu yang Anda inginkan. Bahkan jika Anda menggunakan s/.txt/.text/, itu akan mengonversi footxt.txt hingga fo.text.txt.

Anda harus menggunakan \. untuk mencocokkan periode (. akan cocok dengan karakter apa pun). Dan jejak $ untuk mencocokkan akhir baris. Hanya ini yang akan cocok dengan ekstensi.

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

Berdasarkan jawaban @Prince John Wesley, berikut adalah skrip bash sederhana untuk mengubah semua ekstensi file di direktori saat ini dari ext1 hingga ext2. Juga menampilkan nama file yang diganti namanya.

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

Contoh penggunaan (dengan asumsi nama skrip adalah change-ext):

change-ext ext1 ext2
8

Alasan # 53 untuk beralih ke zsh:

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

7
Burrito

katakanlah file Anda tersebar di berbagai direktori, Dengan anggapan bahwa dirx adalah direktori induk Anda, ini dapat melakukan pekerjaan menggunakan find:

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

Inilah yang bekerja untuk saya:

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

Kapan kamu

tidak memiliki ekstensi untuk file sumber

dan ekstensi target adalah . teks Anda akan melakukannya dengan cara ini -

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

Jika Anda ingin tahu apa yang salah pada versi Anda: Anda menggunakan $files dari pada $x dalam perintah basename. Jadi ini seharusnya bekerja (belum diuji):

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