Saya harus mengganti nama pohon folder lengkap secara rekursif sehingga tidak ada huruf besar yang muncul di mana saja (itu kode sumber C ++, tapi itu tidak masalah).
Poin bonus untuk mengabaikan file / folder kontrol versi CVS dan Subversion. Cara yang disukai adalah skrip shell, karena shell harus tersedia pada kotak Linux apa pun.
Ada beberapa argumen yang valid tentang perincian penamaan file.
Saya pikir file dengan nama huruf kecil yang sama harus ditimpa; itu masalah pengguna. Ketika diperiksa pada sistem file yang mengabaikan kasus, itu juga akan menimpa yang pertama dengan yang terakhir.
Saya akan mempertimbangkan karakter AZ dan mengubahnya menjadi az, yang lainnya hanya menyerukan masalah (setidaknya dengan kode sumber).
Script akan diperlukan untuk menjalankan build di sistem Linux, jadi saya pikir perubahan pada file kontrol versi CVS atau Subversion harus dihilangkan. Lagi pula, ini hanya checkout awal. Mungkin "ekspor" lebih tepat.
ABCdef
,abcDEF
danaBcDeF
? Haruskah script rename dibatalkan atau hanya diperingatkan dan dilanjutkan? 2. Bagaimana Anda mendefinisikan huruf kecil untuk nama yang bukan US-ASCII? Jika nama-nama tersebut mungkin ada, haruskah salah satu memeriksa dan mengecualikan pass dilakukan terlebih dahulu? 3. Jika Anda menjalankan operasi ganti namaJawaban:
Versi ringkas menggunakan
"rename"
perintah:Ini menghindari masalah dengan direktori yang diganti nama sebelum file dan mencoba untuk memindahkan file ke direktori yang tidak ada (misalnya
"A/A"
ke"a/a"
).Atau, versi yang lebih verbose tanpa menggunakan
"rename"
.PS
Yang terakhir memungkinkan lebih banyak fleksibilitas dengan perintah bergerak (misalnya,
"svn mv"
).sumber
then
-losed baris oleh(mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
.find my_root_dir -depth -exec rename -c {} \;
. Tambah -f untuk mengganti nama jika Anda menggunakan sistem file case-insensitive (misal Mac)-T
darimv
perintah.Lebih kecil lagi saya cukup suka:
Jika sistem file tidak sensitif seperti HFS + OS X , Anda perlu menambahkan
-f
flag:sumber
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
perl-rename
(dan disediakan oleh paket dengan nama yang sama)sumber
find
.find .
tampaknya memperbaiki ini.for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Cukup coba yang berikut ini jika Anda tidak perlu peduli efisiensi.
sumber
-0
saklar (yang 'nol', tanpa kompresi)zip -0 -r foo.zip foo/
,.-0
kompresi, hampir instan!Sobat, kalian suka hal-hal yang menyulitkan ... Gunakan:
sumber
rename 'y/a-z/A-Z/' /tmp/*.jpg
->Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory
, yaitu, cobalah untuk mengubah nama seluruh path, bukan hanya file.Sebagian besar jawaban di atas berbahaya, karena mereka tidak berurusan dengan nama yang mengandung karakter aneh. Taruhan Anda aman untuk hal semacam ini adalah dengan menggunakan
find
's-print0
pilihan, yang akan mengakhiri nama file dengan ASCII NUL bukan \ n.Berikut ini skrip, yang hanya mengubah file dan bukan nama direktori agar tidak membingungkan
find
:Saya mengujinya, dan ia bekerja dengan nama file yang mengandung spasi, semua jenis kutipan, dll. Ini penting karena jika Anda menjalankan, sebagai root, salah satu skrip lain di pohon yang menyertakan file yang dibuat oleh
... baik tebak apa ...
sumber
rename
daripadamv
.Ini berfungsi jika Anda sudah memiliki atau mengatur perintah rename (mis. Melalui brew install di Mac):
sumber
brew install rename
--lower-case
? Sayangnya, bukan itu yang terjadi di Arch Linux.rename
bukan bash builtin. Ini adalah utilitas eksternal dan sintaks akan berbeda tergantung pada versi yang Anda instal. Jawaban ini tidak cukup sebagai solusi portabel "untuk semua OS berbasis unix" seperti yang diklaim.rename
perintah yang termasuk dalam Fedora terbaru (28), melaluiutil-linux-2.31
paket, tidak memiliki--lower-case
opsi.Ini berfungsi pada CentOS / Red Hat Linux atau distribusi lainnya tanpa
rename
skrip Perl:Sumber: Ganti nama semua nama file dari huruf besar ke huruf kecil
(Dalam beberapa distribusi,
rename
perintah default berasal dari util-linux, dan itu adalah alat yang berbeda dan tidak kompatibel.)sumber
Pendekatan paling sederhana yang saya temukan di Mac OS X adalah dengan menggunakan paket rename dari http://plasmasturm.org/code/rename/ :
sumber
Inilah solusi suboptimal saya, menggunakan skrip Bash shell:
Folder semua diganti nama dengan benar, dan
mv
tidak mengajukan pertanyaan ketika izin tidak cocok, dan folder CVS tidak diubah namanya (file kontrol CVS di dalam folder itu masih diganti namanya, sayangnya).Karena "find -depth" dan "find | sort -r" keduanya mengembalikan daftar folder dalam urutan yang dapat digunakan untuk penggantian nama, saya lebih suka menggunakan "-depth" untuk mencari folder.
sumber
Pertanyaan aslinya meminta untuk mengabaikan direktori SVN dan CVS, yang dapat dilakukan dengan menambahkan -prune ke perintah find. Misalnya untuk mengabaikan CVS:
Saya mencoba ini, dan menyematkan terjemahan huruf kecil di dalam temuan tidak berfungsi karena alasan yang sebenarnya tidak saya mengerti. Jadi, ubah ini menjadi:
Ian
sumber
Menggunakan fixer nama file Larry Wall:
Sesederhana itu
(dimana
fix
tentu saja skrip di atas)sumber
Ini adalah skrip shell kecil yang melakukan apa yang Anda minta:
Catat aksi -depth di find pertama.
sumber
Tidak portabel, hanya Zsh, tapi cukup ringkas.
Pertama, pastikan
zmv
sudah dimuat.Juga, pastikan
extendedglob
sudah aktif:Kemudian gunakan:
Untuk secara kecil memangkas file dan direktori yang namanya bukan CVS .
sumber
find -depth
mencetak setiap file dan direktori, dengan isi direktori dicetak sebelum direktori itu sendiri.${f,,}
menurunkan nama file.sumber
-depth
perbaikan itu! Ini adalah solusi yang sangat cepat, tetapi tentu saja tanpa menggunakan-print0
opsi untuk menemukan, itu bukan yang paling dapat diandalkanDengan MacOS,
Instal
rename
paket,Menggunakan,
Perintah ini menemukan semua file dengan
*.py
ekstensi dan mengonversi nama file menjadi huruf kecil.Sebagai contoh,
sumber
-I
opsi untuk dixargs
sini?- I
bendera tidak wajib. Ini digunakan ketika kita menjalankan beberapa perintahxargs
. Berikut ini adalah contoh menggunakan beberapa perintah denganxargs
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
Anda dapat menjalankan tanpa-I
sukafind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
Gunakan typeset :
Di Windows, emulasi, seperti Git Bash , mungkin gagal karena Windows tidak peka terhadap huruf besar-kecil. Untuk itu, tambahkan langkah
mv
file itu ke nama lain terlebih dahulu, seperti "$ old.tmp", dan kemudian ke$new
.sumber
Panjang Tapi "Bekerja Tanpa Kejutan & Tanpa Instalasi"
Script ini menangani nama file dengan spasi, tanda kutip, karakter dan Unicode yang tidak biasa lainnya , bekerja pada sistem file case sensitif dan sebagian besar lingkungan Unix-y yang memiliki bash dan awk diinstal (yaitu hampir semua). Ini juga melaporkan tabrakan jika ada (meninggalkan nama file dalam huruf besar) dan tentu saja mengubah nama file & direktori dan bekerja secara rekursif. Akhirnya sangat mudah beradaptasi: Anda dapat men-tweak perintah find untuk menargetkan file / dir yang Anda inginkan dan Anda dapat men-tweak awk untuk melakukan manipulasi nama lain. Perhatikan bahwa dengan "menangani Unicode" Maksud saya memang akan mengubah kasus mereka (tidak mengabaikan mereka seperti jawaban yang menggunakan
tr
).Referensi
Skrip saya didasarkan pada jawaban yang sangat bagus ini:
/unix/9496/looping-through-files-with-spaces-in-the-names
Bagaimana cara mengubah string menjadi huruf kecil di Bash?
sumber
Ini juga berfungsi dengan baik di macOS:
sumber
Saya perlu melakukan ini pada pengaturan Cygwin pada Windows 7 dan menemukan bahwa saya mendapatkan kesalahan sintaks dengan saran dari atas yang saya coba (walaupun saya mungkin telah melewatkan opsi yang berfungsi). Namun, solusi ini langsung dari forum Ubuntu berhasil :-)
(NB: Saya sebelumnya mengganti spasi dengan menggarisbawahi menggunakan:
)
sumber
Di OS X,
mv -f
muncul kesalahan "file yang sama", jadi saya ganti nama dua kali:sumber
Saya akan meraih Python dalam situasi ini, untuk menghindari jalur asumsi tanpa spasi atau garis miring optimis. Saya juga menemukan bahwa
python2
cenderung dipasang di lebih banyak tempat daripadarename
.sumber
Jika Anda menggunakan Arch Linux , Anda dapat menginstal
rename
) paket dariAUR
yang memberikanrenamexm
perintah sebagai/usr/bin/renamexm
executable dan halaman manual bersama dengannya.Ini adalah alat yang sangat ampuh untuk mengganti nama file dan direktori dengan cepat.
Konversikan ke huruf kecil
Konversi ke kasing kasus
Pilihan lain
Anda dapat mengambil sampel file Developers.mp3 dari sini , jika perlu;)
sumber
brew
pada macOS telah-l
terikat untuk menciptakan symlink, dan-c
untuk mengkonversi ke huruf kecil, jadi hati-hati.Pertama, ganti nama direktori sortir ke atas -r (di mana -depth tidak tersedia), maka file. Kemudian grep -v / CVS alih-alih menemukan ...- pangkas karena lebih sederhana. Untuk direktori besar, untuk f in ... dapat meluap beberapa buffer shell. Gunakan temukan ... | saat membaca untuk menghindari itu.
Dan ya, ini akan merusak file yang hanya berbeda jika ...
sumber
find YOURDIR -type d | sort -r
terlalu banyak masalah. Kamu inginfind YOURDIR -depth -type d
. Kedua,find -type f
HARUS dijalankan setelah direktori diubah namanya.Saya belum mencoba skrip yang lebih rumit yang disebutkan di sini, tetapi tidak ada versi commandline tunggal yang bekerja untuk saya di NAS Synology saya.
rename
tidak tersedia, dan banyak variasifind
gagal karena tampaknya tetap menggunakan nama lama dari jalur yang sudah diganti nama (mis., jika ditemukan./FOO
diikuti oleh./FOO/BAR
, penggantian nama./FOO
ke./foo
akan tetap berlanjut ke daftar./FOO/BAR
meskipun jalur itu tidak lagi valid) . Perintah di atas bekerja untuk saya tanpa masalah.Berikut ini adalah penjelasan dari setiap bagian dari perintah:
Ini akan menemukan file apa pun dari direktori saat ini (ubah
.
ke direktori apa pun yang ingin Anda proses), menggunakan pencarian kedalaman-pertama (mis., Ia akan mendaftar./foo/bar
sebelumnya./foo
), tetapi hanya untuk file yang berisi karakter huruf besar. The-name
Filter hanya berlaku untuk nama file base, bukan path lengkap. Jadi ini akan mencantumkan./FOO/BAR
tetapi tidak./FOO/bar
. Ini tidak masalah, karena kami tidak ingin mengganti nama./FOO/bar
. Kami ingin mengubah nama./FOO
, tetapi yang terdaftar nanti (inilah mengapa-depth
penting).Perintah ini dengan sendirinya sangat berguna untuk menemukan file yang ingin Anda ganti namanya sejak awal. Gunakan ini setelah perintah ganti nama lengkap untuk mencari file yang masih belum diganti karena tabrakan atau kesalahan nama file.
Bagian ini membaca file yang dihasilkan oleh
find
dan memformatnya dalammv
perintah menggunakan ekspresi reguler. The-n
pilihan berhentised
dari mencetak input, danp
perintah dalam pencarian dan mengganti output regex teks diganti.Regex itu sendiri terdiri dari dua tangkapan: bagian atas / terakhir (yang merupakan direktori file), dan nama file itu sendiri. Direktori dibiarkan utuh, tetapi nama file diubah menjadi huruf kecil. Jadi, jika
find
output./FOO/BAR
, itu akan menjadimv -n -v -T ./FOO/BAR ./FOO/bar
. The-n
pilihanmv
merek yakin ada file huruf kecil tidak ditimpa. The-v
pilihan membuatmv
output setiap perubahan yang membuat (atau tidak membuat - jika./FOO/bar
sudah ada, itu output sesuatu seperti./FOO/BAR -> ./FOO/BAR
, mencatat bahwa tidak ada perubahan telah dibuat). Ini-T
sangat penting di sini - ini memperlakukan file target sebagai direktori. Ini akan memastikan bahwa./FOO/BAR
tidak dipindahkan ke./FOO/bar
jika direktori itu ada.Gunakan ini bersama-sama dengan
find
untuk menghasilkan daftar perintah yang akan dieksekusi (berguna untuk memverifikasi apa yang akan dilakukan tanpa benar-benar melakukannya)Cukup jelas. Ini merutekan semua
mv
perintah yang dihasilkan ke shell interpreter. Anda dapat menggantinya denganbash
atau kulit apa pun yang Anda suka.sumber
Slugify Rename (regex)
Bukan apa yang diminta OP, tapi apa yang saya harap temukan di halaman ini:
Versi "slugify" untuk mengganti nama file sehingga mirip dengan URL (yaitu hanya menyertakan alfanumerik, titik, dan tanda hubung):
sumber