Adakah yang bisa merekomendasikan solusi yang aman untuk secara rekursif mengganti ruang dengan garis bawah pada nama file dan direktori mulai dari direktori root yang diberikan? Sebagai contoh:
$ tree
.
|-- a dir
| `-- file with spaces.txt
`-- b dir
|-- another file with spaces.txt
`-- yet another file with spaces.pdf
menjadi:
$ tree
.
|-- a_dir
| `-- file_with_spaces.txt
`-- b_dir
|-- another_file_with_spaces.txt
`-- yet_another_file_with_spaces.pdf
linux
bash
whitespace
filenames
armandino
sumber
sumber
foo bar
dan file lain yang disebutfoo_bar
di direktori yang sama?Jawaban:
Gunakan
rename
(aliasprename
) yang merupakan skrip Perl yang mungkin sudah ada di sistem Anda. Lakukan dalam dua langkah:Berdasarkan jawaban Jürgen dan mampu menangani beberapa lapisan file dan direktori dalam satu ikatan menggunakan versi "Revisi 1.5 1998/12/18 16:16:31 rmb1" dari
/usr/bin/rename
(skrip Perl):sumber
rename
manual (saya tidak tahu alatnya) dan saya pikir Anda dapat mengoptimalkan kode Anda dengan mengubahs/ /_/g
menjadiy/ /_/
;-)brew install rename
Saya menggunakan:
Meskipun tidak rekursif, ini cukup cepat dan sederhana. Saya yakin seseorang di sini dapat memperbaruinya untuk menjadi rekursif.
Bagian ini
${f// /_}
menggunakan mekanisme ekspansi parameter bash untuk mengganti pola dalam parameter dengan string yang disediakan. Sintaks yang relevan adalah${parameter/pattern/string}
. Lihat: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html atau http://wiki.bash-hackers.org/syntax/pe .sumber
rename
, dan itu terlalu sulit untuk menginstal ini dengan minuman ..)for d in *\ *; do mv "$d" "${d// /}"; done
non di bawah skor.shopt -s globstar
danfor f in **/*\ *; do ...
. Theglobstar
pilihan adalah internal untuk bash, sedangkanrename
perintah adalah alat Linux umum dan bukan bagian dari bash.${f// /_}
adalah ekspansi variabel Bash untuk pencarian dan penggantian . - Inif
adalah variabel darifor
loop untuk setiap file yang berisi spasi. - Yang pertama//
berarti "ganti semua" (jangan berhenti pada kejadian pertama). - Kemudian `/ _` berarti" ganti spasi dengan garis bawah "gagal melakukannya dengan benar pada awalnya, karena saya tidak memikirkan direktori.
sumber
IFS=''
di depanread
. Juga, untuk apa yang dapat saya katakan dengan komentar lain,sort
langkah dapat dibatalkan demi-depth
opsifind
.\
(backslash). Dapat diperbaiki dengan menambahkan-r
opsi untuk membaca.rename
perintah yang disarankan oleh Dennis.macports
punyarename
? Saya tidak pernah repot-repot mencari tahu karena saya pikir tugas itu tidak membenarkan utilitas. Dan jika Anda belum memilikinyamacports
, Anda harus mempertimbangkan untuk menginstalnya;)Anda bisa menggunakannya
detox
oleh Doug Harplesumber
Solusi find / rename . rename adalah bagian dari util-linux.
Anda harus menuruni kedalaman terlebih dahulu, karena nama file spasi putih dapat menjadi bagian dari direktori spasi putih:
sumber
bash 4.0
sumber
a' to a subdirectory of itself,
a / a ')/dev/null
.mv
lima puluh lima ribu kali hanya untuk mengganti nama empat file mungkin sedikit overhead bahkan jika Anda tidak membanjiri pengguna dengan pesan.for file in *' '*
atau semacamnya melakukan pekerjaan yang lebih baik?Anda bisa menggunakan ini:
sumber
Versi rekursif dari Jawaban Naidim.
sumber
Berikut ini adalah (cukup verbose) solusi -exec yang menulis peringatan "file sudah ada" untuk stderr:
sumber
Yang ini sedikit lebih. Saya menggunakannya untuk mengganti nama torrents yang saya unduh (tidak ada karakter khusus (non-ASCII), spasi, banyak titik, dll.).
sumber
Saya menemukan skrip ini, mungkin menarik :)
sumber
Berikut solusi bash script berukuran cukup
sumber
ls
.Bagi mereka yang berjuang melalui ini menggunakan macOS, instal terlebih dahulu semua alat:
Kemudian ketika diperlukan untuk mengganti nama, buat alias untuk GNU find (gfind) sebagai find. Kemudian jalankan kode @Michel Krelin:
sumber
Ini hanya menemukan file di dalam direktori saat ini dan mengganti nama mereka . Saya memiliki ini alias.
find ./ -name "* *" -type f -d 1 | perl -ple '$file = $_; $file =~ s/\s+/_/g; rename($_, $file);
sumber
Saya hanya membuat satu untuk tujuan saya sendiri. Anda dapat menggunakannya sebagai referensi.
sumber
Untuk file dalam folder bernama / file
sumber
Solusi saya untuk masalah ini adalah skrip bash:
cukup masukkan nama direktori, di mana Anda ingin menerapkan skrip, sebagai argumen setelah menjalankan skrip.
sumber
Sama seperti jawaban yang dipilih.
sumber