Saya ingin mengubah ekstensi file dari *.txt
menjadi *.text
. Saya mencoba menggunakan basename
perintah, tetapi saya mengalami kesulitan 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
bash
shell-script
rename
afbr1201
sumber
sumber
Jawaban:
Langsung dari Greg's Wiki :
Lihat juga entri tentang mengapa Anda tidak perlu menguraikan
ls
.Sunting: jika Anda harus menggunakan
basename
sintaks Anda adalah:sumber
*.txt
sintaksis) , tanda hubung ganda--
, dan penggunaan simbol% dalam${}
konstruk . Sampai sekarang saya belum pernah menemukan dua yang terakhir dan belum tahu apa yang sebenarnya terjadi dengan yang pertama.for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
Inilah cara saya mengubah semua ekstensi file di direktori saat ini di Debian.
(Ini adalah
rename
perintah Perl , bukan yangutil-linux
. Lihat Mengapa utilitas penggantian nama di Debian / Ubuntu berbeda dari yang ada di distribusi lain, seperti CentOS? )sumber
brew install rename
dan membuatnya berfungsi.rename "s/oldExtension/newExtension/" **.txt
untuk mengubah nama semua * .txt secara rekursiffootxt.txt
. Gunakan ini sebagai gantinya: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *
Perintah sederhana,
rename
dariutil-linux
, akan melakukan itu untuk Anda, itu menggantikan setiap kemunculan "txt" menjadi "teks" di semua file yang cocok dengan "* .txt":sumber
rename
mengubah kejadian pertama, jadi lebih baik buat iturename .txt .text
, tetapi ini masih tidak akan selalu berhasil (misalnya berganti namafoo.txtx.bar.txt
menjadifoo.textx.bar.txt
).rename
perintahnya sebenarnyaperl-rename
dan menggunakan perl regexes. Untuk itu, perintah setara akan:rename 's/.txt/.text/' *.txt
. Orang harus memeriksaman rename
sistem mereka untuk mengetahui yang mana yang mereka miliki.Di atas berfungsi dengan baik tetapi terbatas pada direktori saat ini. Coba perintah di bawah ini, yang fleksibel dengan sub-direktori. Ini akan mengganti nama semua
.txt
file di bawah struktur direktori dengan ekstensi baru.sumber
rename
dapat menangani banyak file sebagai argumen, Anda dapat mempercepat banyak hal dengan menggunakan+
alih-alih\;
jika ada banyak file seperti itufootxt.txt
. Gunakan ini sebagai gantinya: unix.stackexchange.com/questions/19654/…sumber
Jawaban di sini referensi
s/oldExtension/newExtension/
salah. Jika Anda menggunakans/txt/text/
, Anda akan mengonversifootxt.txt
kefootext.txt
, yang bukan yang Anda inginkan. Bahkan jika Anda menggunakans/.txt/.text/
, itu akan dikonversifootxt.txt
menjadifo.text.txt
.Anda harus menggunakan
\.
untuk mencocokkan periode (.
akan cocok dengan karakter apa pun). Dan trailing$
untuk mencocokkan ujung garis. Hanya ini yang akan cocok dengan ekstensi.sumber
Berdasarkan jawaban @Prince John Wesley, berikut adalah skrip bash sederhana untuk mengubah semua ekstensi file di direktori saat ini dari
ext1
menjadiext2
. Juga menampilkan nama file yang diganti namanya.Contoh penggunaan (dengan asumsi nama skripnya
change-ext
):sumber
for...
) dengan dua baris:shopt -s globstar
danfor f in **/*.$1
. Membutuhkan Bash 4+.Alasan # 53 untuk beralih ke zsh:
zmv '(*).txt' '$1.text'
sumber
katakanlah file Anda tersebar di berbagai direktori, Dengan anggapan bahwa dirx adalah direktori induk Anda, ini dapat melakukan pekerjaan menggunakan find:
sumber
Inilah yang bekerja untuk saya:
sumber
Kapan kamu
dan ekstensi target .text Anda akan melakukannya dengan cara ini -
sumber
for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
Jika Anda ingin tahu apa yang salah dalam versi Anda: Anda menggunakan
$files
alih-alih$x
pada perintah nama bas. Jadi ini seharusnya bekerja (belum diuji):sumber