Ubah nama semua file dalam folder dengan awalan "Unix_"
Misalkan folder memiliki dua file
a.txt
b.pdf
maka keduanya harus diganti namanya dari satu perintah menjadi
Unix_a.txt
Unix_b.pdf
Ubah nama semua file dalam folder dengan awalan "Unix_"
Misalkan folder memiliki dua file
a.txt
b.pdf
maka keduanya harus diganti namanya dari satu perintah menjadi
Unix_a.txt
Unix_b.pdf
Jawaban:
Jika nama file Anda tidak berisi whitepace dan Anda tidak memiliki subdirektori, Anda dapat menggunakan for
loop sederhana :
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
Jika tidak, gunakan rename
perintah yang mudah (yang merupakan skrip perl) - meskipun mungkin tidak tersedia di luar kotak pada setiap Unix (mis. OS X tidak disertakan denganrename
).
Tinjauan singkat di debian-administration.org:
Jika nama file Anda berisi spasi, ini lebih mudah digunakan find
, di Linux yang berikut seharusnya berfungsi:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
-printf
Sayangnya, pada sistem BSD tidak ada pilihan. Tetapi GNU findutils harus dapat diinstal (misalnya pada Mac OS X dengan brew install findutils
).
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
find
.
for f in *; do [[ -f ${f} ]] && mv ...; done
untuk hanya menangkap file (tidak ada sub-direktori, tautan, dll.) ...
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
berfungsi dengan benar terlepas dari karakter apa yang ada di nama file. Itu memindahkan direktori, soket, symlink dan jenis file lainnya juga; Saya kira itu tidak masalah.
.
sebelum semua file saya
Coba rename
perintah di folder dengan file :
rename 's/^/Unix_/' *
Argumen ganti nama ( perintah sed s ) menunjukkan untuk mengganti regex ^ dengan Unix_ . Tanda sisipan (^) adalah karakter khusus yang berarti awal baris .
's/^/.../'
artinya?
's/^/.../'
adalah argumen ekspresi perl untuk perintah ganti nama
rename 's/^start_/run_' *
Saya pikir inilah yang Anda cari:
ls | xargs -I {} mv {} Unix_{}
Ya, itu sederhana namun elegan dan kuat, dan juga satu baris. Anda bisa mendapatkan pengantar yang lebih detail dari saya di halaman: Ubah Nama File dan Direktori (Tambah Awalan)
ls
- ini dapat menyebabkan masalah jika ada spasi atau karakter aneh lainnya dalam nama file.
Saya baru-baru ini menghadapi situasi yang sama dan menemukan solusi bawaan yang lebih mudah. Saya membagikannya di sini agar dapat membantu orang lain yang mencari solusi.
Dengan OS X Yosemite, Apple telah mengintegrasikan kemampuan penggantian nama batch langsung ke Finder. Informasi detail tersedia di sini . Saya telah menyalin langkah-langkah di bawah ini juga,
Ubah nama beberapa item
Pilih item, lalu Control-klik salah satunya.
Di menu pintasan, pilih Ubah Nama Item.
Di menu pop-up di bawah Ubah Nama Item Folder, pilih untuk mengganti teks dalam nama, menambahkan teks ke nama, atau mengubah format nama.
Ganti teks: Masukkan teks yang ingin Anda hapus di kolom Temukan, lalu masukkan teks yang ingin Anda tambahkan di kolom "Ganti dengan".
Menambahkan teks: Masukkan teks yang ingin Anda tambahkan di bidang, lalu pilih untuk menambahkan teks sebelum atau sesudah nama saat ini.
Format: Pilih format nama untuk file, lalu pilih untuk meletakkan indeks, penghitung, atau tanggal sebelum atau sesudah nama. Masukkan nama di bidang Format Kustom, lalu masukkan nomor yang Anda inginkan untuk memulai.
Klik Ganti Nama.
Jika Anda memiliki pola umum dalam file Anda daripada Anda dapat menggunakan Ganti teks jika tidak Tambahkan teks juga akan melakukan pekerjaan itu.
Anda bisa menggunakan -i
saja-I {}
ls | xargs -i mv {} unix_{}
Ini juga bekerja dengan sempurna.
ls
- mencantumkan semua file dalam direktorixargs
- menerima semua file baris demi baris karena -i
opsi{}
adalah tempat penampung untuk semua file, diperlukan jika xargs
mendapat lebih dari dua argumen sebagai masukanMenggunakan awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
sudah usang, sekarang hanya-I
Juga berfungsi untuk item dengan spasi dan mengabaikan direktori
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
Dengan rnm (Anda perlu menginstalnya):
rnm -ns 'Unix_/fn/' *
Atau
rnm -rs '/^/Unix_/' *
PS: Saya penulis alat ini.
rename
tidak berhasil untuk saya, tetapi berhasil rnm
.
Situasi:
Kami ada certificate.key
certificate.crt
di dalam/user/ssl/
Kami ingin mengganti nama apa pun yang dimulai dengan certificate
menjadicertificate_OLD
Kami sekarang berada di dalam /user
Pertama, Anda melakukan uji coba dengan -n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
Yang mengembalikan:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
File Anda tidak akan berubah, ini hanya uji coba.
Larutan:
Ketika Anda senang dengan hasil tes, jalankan secara nyata:
rename "s/certificate/certificate_OLD/" ./ssl/*
Apa artinya:
`ganti nama" s / SOMETHING / SOMETING_ELSE "PATH / FILES
Tip:
Jika Anda sudah berada di jalur, jalankan seperti ini:
rename "s/certificate/certificate_OLD/" *
Atau jika Anda ingin melakukan ini di sub-direktori mana pun yang dimulai dengan ss
do:
rename -n "s/certificat/certificate_old/" ./ss*/*
Anda juga bisa melakukan:
rename -n "s/certi*/certificate_old/" ./ss*/*
Yang mengganti nama apa pun yang dimulai dengan certi
sub-direktori mana pun yang dimulai denganss
.
Langit adalah batasnya.
Bermain-main dengan regex dan SELALU uji ini SEBELUMNYA -n
.
HATI-HATI INI BAHKAN RENAME NAMA FOLDER YANG SESUAI. Lebih baik cd
masuk ke direktori dan lakukan di sana. GUNAKAN RISIKO SENDIRI.
find -execdir rename
Ini mengganti nama file dan direktori dengan ekspresi reguler yang hanya mempengaruhi nama dasar.
Jadi untuk awalan Anda bisa melakukan:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
atau untuk mempengaruhi file saja:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
pertama cd
masuk ke direktori sebelum mengeksekusi hanya pada nama dasar.
Saya telah menjelaskannya lebih detail di: Temukan banyak file dan ganti namanya di Linux