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:
-
rename
dariutil-linux
suite, 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.txt
selain ekstensi terakhir, Anda dapat menulisrename .txt .bak *.txt
-
rename
adalah 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'
-
zmv
adalah 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).zmv
juga 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).