Ubah nama semua file dalam folder dengan awalan dalam satu perintah

Jawaban:

108

Jika nama file Anda tidak berisi whitepace dan Anda tidak memiliki subdirektori, Anda dapat menggunakan forloop sederhana :

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

Jika tidak, gunakan renameperintah 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

-printfSayangnya, 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
miku
sumber
@Matteo: Terima kasih petunjuknya: memperbarui jawaban saya dengan peringatan ditambah dua contoh dengan find.
miku
Juga akan merekomendasikan for f in *; do [[ -f ${f} ]] && mv ...; doneuntuk hanya menangkap file (tidak ada sub-direktori, tautan, dll.) ...
twalberg
1
Jika Anda mengutip variabel sebagaimana mestinya, maka for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; doneberfungsi 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.
Jonathan Leffler
Entah bagaimana ini menambahkan .sebelum semua file saya
nullability
77

Coba renameperintah 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 .

pavium
sumber
9
Bisakah Anda menjelaskan apa 's/^/.../'artinya?
mcont
@Matteo 's/^/.../'adalah argumen ekspresi perl untuk perintah ganti nama
RoyalleBlue
ini luar biasa! saya sarankan untuk menambahkan folder / *, karena * agak berbahaya jika perintah secara tidak sengaja akan terulang di tempat lain
System Rebooter
brew instal ganti nama @OliverPearmain
Felipe Plazas
Contoh untuk mengganti awalan:rename 's/^start_/run_' *
DenisKolodin
36

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)

Zheng Qsin
sumber
2
Berhati-hatilah saat memproses output ls- ini dapat menyebabkan masalah jika ada spasi atau karakter aneh lainnya dalam nama file.
Jonathan Leffler
17

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

  1. Pilih item, lalu Control-klik salah satunya.

  2. Di menu pintasan, pilih Ubah Nama Item.

  3. 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.

  4. 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.

Tejas C
sumber
1
Luar biasa - menghemat banyak waktu saya!
pengguna3000868
7

Anda bisa menggunakan -isaja-I {}

ls | xargs -i mv {} unix_{}

Ini juga bekerja dengan sempurna.

  • ls - mencantumkan semua file dalam direktori
  • xargs- menerima semua file baris demi baris karena -iopsi
  • {}adalah tempat penampung untuk semua file, diperlukan jika xargsmendapat lebih dari dua argumen sebagai masukan

Menggunakan awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
NirajW
sumber
-isudah usang, sekarang hanya-I
JamPow
itu membantu saya di Debian 8. Thaks
Abror Esonaliev
2

Juga berfungsi untuk item dengan spasi dan mengabaikan direktori

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
pengguna645527
sumber
1

Dengan rnm (Anda perlu menginstalnya):

rnm -ns 'Unix_/fn/' *

Atau

rnm -rs '/^/Unix_/' *

PS: Saya penulis alat ini.

Jahid
sumber
2
Anda harus memeriksa semua jawaban Anda tentang utilitas Anda, dan menambahkan penafian bahwa Anda adalah penulisnya.
Mogsdad
@Mogsdad: Saya rasa itu bukan info yang diperlukan. Jika seseorang ingin mencari penulisnya, itu cukup mudah.
Jahid
Terima kasih untuk alat ini. Untuk beberapa alasan, renametidak berhasil untuk saya, tetapi berhasil rnm.
Aloso
0

Situasi:

Kami ada certificate.key certificate.crtdi 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 ssdo:

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 certisub-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 cdmasuk ke direktori dan lakukan di sana. GUNAKAN RISIKO SENDIRI.

Khalil Gharbaoui
sumber
0

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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber