Salah satu perbedaan mendasar antara cmd Windows dan shell POSIX yang bertanggung jawab untuk ekspansi wildcard. Kerang melakukan semua perluasan yang diperlukan sebelum memulai perintah aktual yang Anda minta. cmd kebanyakan meneruskan pola wildcard ke perintah yang tidak dimodifikasi. (Saya katakan sebagian besar, karena menurut saya ada pengecualian, dan variabel lingkungan diperluas dalam sebagian besar keadaan.) Ini membuat penulisan rename yang akan bekerja dengan sintaks yang sama seperti di cmd cukup rumit.
Tapi ada rename untuk Linux - dengan argumen yang sangat berbeda, periksa halaman manual (yang agak singkat di sistem saya, dan rename berasal dari util-linux paket di sistem saya, yang seharusnya tersedia secara luas). Ganti nama pertama Anda akan dilakukan seperti ini:
rename .txt .bak *.txt
Perhatikan bahwa shell melakukan * ekspansi, jadi rename sendiri sebenarnya mengira itu dipanggil seperti ini:
rename .txt .bak file1.txt file2.txt file3.txt ...
Jadi Anda bisa menebak versi file tunggal:
rename .txt .bak file1.txt
Jika Anda tidak ingin menggunakan rename tetapi terapkan ini sendiri, Anda dapat membuat fungsi untuk itu. Dengan asumsi Anda hanya ingin mengubah ekstensi file, dan untuk mengganti nama satu file, lihat ini:
$ function chext() {
newext="$1"
file="$2"
newfile="${file%.*}$newext"
echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv
$newfile dibangun menggunakan penghapusan substring untuk menghapus ekstensi asli, lalu menggabungkan ekstensi baru. Anda dapat memperluas fungsi tersebut untuk menangani banyak file dengan relatif mudah.
Adapun ls Anda pertanyaan, gunakan -d mengalihkan. Ini akan mencegah ls dari daftar isi direktori.
Demo:
$ ls -al
total 536
drwx------ 3 owner users 528384 Jan 7 17:29 .
drwxr-xr-x 126 owner users 12288 Jan 7 17:26 ..
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f1.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f2.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f3.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f4.csv
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
Ganti nama karakter pengganti
$ rename .csv .txt f*
$ ls -al
total 536
drwx------ 3 owner users 528384 Jan 7 17:34 .
drwxr-xr-x 126 owner users 12288 Jan 7 17:26 ..
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f1.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f2.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f3.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f4.txt
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
Ganti nama file tunggal
$ rename .txt .csv f1.txt
$ ls -al
total 536
drwx------ 3 owner users 528384 Jan 7 17:34 .
drwxr-xr-x 126 owner users 12288 Jan 7 17:26 ..
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f1.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f2.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f3.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f4.txt
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
ls default
$ ls -l t*
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
test:
total 0
-rw-r--r-- 1 owner users 0 Jan 7 17:33 dont_show_me_please
ls yang tidak memeriksa direktori
$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
Satu hal yang perlu diingat ketika datang ke wildcard adalah mereka diperluas oleh shell. Aplikasi tidak tahu apakah Anda menggunakan wildcard atau mengetik nama. Misalnya, jika Anda mengetik rename *.txt *.bak , lalu rename perintah melihat sesuatu seperti rename file1.txt file2.txt existingfile.bak . Itu tidak cukup informasi untuk melanjutkan.
Saya akan menangani pertanyaan tentang ls pertama, karena lebih sederhana. Jika yang Anda inginkan hanyalah nama yang cocok, maka Anda tidak memerlukan ls , karena shell sudah melakukan ekspansi.
echo t*
Jika Anda ingin informasi lebih lanjut tentang file tersebut, berikan -d opsi untuk ls , untuk memberi tahu agar tidak mencantumkan konten direktori.
ls -ld t*
Tidak ada utilitas standar untuk mengganti nama file, karena sistem unix pertama tidak memilikinya. Metode portabel untuk mengganti nama file menggunakan loop dan sedikit bertele-tele:
for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done
Ada beberapa utilitas umum untuk mengganti nama file, tidak ada yang dijamin dapat diinstal pada sistem unix tertentu, tetapi semuanya mudah diinstal. Inilah yang utama:
-
renamedariutil-linuxsuite, tersedia di setiap sistem Linux non-embedded (dan tidak di tempat lain). Di Debian dan turunannya (termasuk Ubuntu), perintah ini disebutrename.ul. Asalkan tidak ada kemunculan.txtselain ekstensi terakhir, Anda dapat menulisrename .txt .bak *.txt -
renameadalah skrip Perl yang dikirimkan oleh Debian dan turunannya sebagai/usr/bin/rename. Anda dapat mengganti nama file sesuai dengan perintah Perl yang sewenang-wenang.rename 's/\.txt\z/\.bak/' *.txt -
mmv, yang dapat mengganti nama, menyalin, dan menautkan file menurut beberapa pola berbasis nama dan memiliki banyak opsi terkait dengan apa yang terjadi jika nama target sudah ada. Perhatikan bahwa Anda harus menggunakan tanda kutip untuk melindungi karakter pengganti dari ekspansi oleh shell.mmv '*.txt' '#1.txt' -
zmvadalah fungsi zsh, tersedia jika dan hanya jika shell Anda adalah zsh. Itu dapat mencocokkan pola zsh arbitrer (sehingga Anda dapat mencocokkan nama file sesuai dengan ekspresi reguler arbitrer, bukan hanya wildcard, dan Anda dapat mencocokkan file dengan kriteria lain seperti tanggal dan ukuran).zmvjuga dapat menyalin dan menautkan.zmv '(*).txt' '$1.txt'
Jika Anda memiliki kendali atas mesin yang Anda gunakan, rekomendasi saya adalah menggunakan zsh sebagai shell Anda (ini memiliki manfaat lain dibandingkan bash) dan letakkan baris ini di ~/.zshrc Anda :
autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'
noglob adalah fitur zsh yang memberi tahu shell untuk tidak memperluas wildcard dalam argumen perintah. Dengan cara ini Anda dapat menulis zmv *.txt \$1.txt (Anda harus selalu melindungi $ dalam teks pengganti).