Sederhana saja. Saya tidak tahan ketika orang menggunakan spasi saat menamai file. Kadang-kadang merusak perintah konsol dan membuat output ls jelek.
Tantangannya adalah menulis sebuah program (hanya karakter ascii) yang
- mengganti nama semua file (termasuk direktori) di direktori saat ini ke versi dengan spasi dihapus atau diganti dengan '_'
- pada tabrakan, Anda perlu menambahkan pengidentifikasi unik (terserah Anda)
- turun secara rekursif ke semua subdirektori
Anda dapat mengasumsikan nama jalur bergaya UNIX. Lagi pula, siapa yang butuh program ini di mesin Windows?
Ini adalah kode golf, program terpendek menang (karakter #ascii). Karena saya sangat membenci ruang, setiap ruang harus dihitung dua kali.
Harap berikan bahasa, skor, program, dan deskripsi singkat tentang cara menjalankannya.
Program harus mengkompilasi dan mengeksekusi dengan upaya yang wajar pada mesin linux saya.
EDIT: Saat Etan meminta struktur file untuk pengujian, berikut ini skrip yang saya gunakan saat ini untuk membuat pohon file yang sesuai:
#!/bin/bash
rm -r TestDir
touchfiles()
{
touch my_file
touch my__file
touch "my file"
touch "my file"
touch " my_file "
}
mkdir TestDir
cd TestDir
touchfiles
for dir in "Test Sub" Test_Sub "Te stSub" Te_stSub
do
mkdir "$dir"
cd "$dir"
touchfiles
cd ..
done
sumber
Jawaban:
Zsh + GNU coreutils - 48 byte (1 spasi)
Sungguh aneh bahwa Anda membenci ruang (ASCII) tetapi baik-baik saja dengan tab dan baris baru, tapi saya kira itu membutuhkan semua jenis.
zmv memecahkan banyak masalah pengubahan nama file secara ringkas (dan hanya sedikit tidak jelas). Namun, itu menegaskan bahwa target itu unik; sementara Anda dapat dengan mudah menambahkan sufiks unik, menambahkan sufiks hanya jika dibutuhkan cukup banyak membutuhkan pengerjaan ulang semua pekerjaan. Jadi alih-alih saya mengulang secara manual dan bergantung pada GNU mv untuk menambahkan pengidentifikasi unik jika terjadi tabrakan (
--backup
opsi, ditambah--no-target-directory
jika target adalah direktori yang ada, karena jika tidakmv
akan memindahkan sumber di dalam direktori itu).(od)
adalah kualifikasi global untuk mengurutkan output dengan direktori yang muncul setelah konten mereka (seperti find-depth
).D
termasuk file dot di glob.:h
dan:t
yang pengubah sejarah mirip dengandirname
danbasename
.mv
mengeluh bahwa itu dipanggil untuk mengganti nama file untuk diri mereka sendiri, karena glob termasuk nama file tanpa spasi. C'est la vie.Versi tidak disatukan:
sumber
zmv
mengebom sebelummv
memiliki kesempatan untuk menyelesaikan tabrakan. Ok, saya melakukan ini secara manual. Ternyata panjangnya persis sama jika saya melewatkan file dot dan bahkan menyimpan karakter jika tidak.Bash 116 byte, 16 spasi
Saya tidak menekan kesalahan untuk mendapatkan beberapa byte lagi. Ini tidak akan memiliki tabrakan.
Jika GNU non-posix
find
dapat diharapkan, ini dapat dipersingkat lebih lanjut:Bash 110 byte, 15 spasi
Menghapus spasi alih-alih menggantinya menggunakan dua byte lebih sedikit:
Bash 108 byte, 15 spasi
Catatan: jika tab dapat digunakan sebagai ganti spasi, hanya 1 spasi yang diperlukan (yang ada dalam aturan kecocokan untuk substitusi di baris 2).
Terima kasih kepada Dennis untuk menemukan bug pada penawaran ganda (dan memberikan solusi)
sumber
-depth
dalam GNU dapat digantikan oleh-d
, meskipun mengeluh bahwa itu sudah usang. Saya tidak tahu tentang aturan golf, bisakah saya melakukannya?bash -c 'B=${0##*/}...' {} \;
yang sebenarnya lebih pendek.N
variabel? Tidak pernah didefinisikan ...Python 180 byte
hanya 2 spasi jika Anda menggunakan tab untuk indentasi :-)
sumber
Jika urutan sufiks file bertabrakan tidak perlu memberikan preseden ke file yang sudah ada maka yang berikut berfungsi untuk saya:
bash / find / mv 84 byte, 16 spasi
bash / find / mv 82 byte, 14 spasi
Cuddled
&&
untuk menghemat dua byte ruang.bash / find / mv 60 byte, 11 spasi
Menjatuhkan perlindungan kesalahan sehingga mendapat kesalahan dari mv pada file yang tidak memiliki ruang untuk memulai.
Sunting: Menjatuhkan tanda kutip dari yang
{}
diingatkan oleh Dennis. Juga diizinkanfind
untuk berteriak tentang portabilitas dan penghinaan dalam versi terpendek di manamv
sudah berteriak tentang memindahkan file di atas itu sendiri.Sunting 2: Ditambahkan
-T
kemv
perintah untuk menghindari direktori bersarang alih-alih mengganti nama seperti yang ditunjukkan oleh pqnet. Perluasan brace bekas dengan biaya satu karakter lebih dari hanya menggunakan satu ruang.sumber
-d
alih-alih-depth
dan Anda tidak perlu mengutip{}
.-d
percakapan pada jawaban pqnet tetapi berpikir karena saya membungkammv
teriakan saya menghindarifind
teriakan. Meskipun saya mungkin harus mempersingkat untuk yang berteriak. Dan ya, saya selalu mengutip{}
untuk beberapa alasan meskipun saya tahu Anda tidak perlu melakukannya. Kekuatan kebiasaan kurasa.-T
opsi untukmv
menghindari iniNodeJS - 209 byte, 3 spasi putih
sumber
node file.js
TypeError: Object #<Object> has no method 'exists'
. Coba tebak: ada di baris 1! : DBash - 86 byte
sumber
--backup
menjadi--b
Bash + Perl
rename
64(
rename
adalah skrip Perl pada Debian dan turunannya, bukan perintah util-linux.)sumber
*
seharusnya{}
, karena ini hanya mengubah nama file yang namanya muncul di direktori saat ini. Ini tidak menambahkan akhiran jika terjadi tabrakan. Anda dapat menyimpan sedikit dengan menghilangkan-name "* *"
karenarename
diam-diam mengabaikan file yang namanya tidak diubah.POSIX
sh
+ GNUfind
+ GNUmv
67 ASCII byte + satu (literal) ruangSaya tidak tahu apakah itu cocok, tetapi dengan urutan ruang apa pun ini disingkirkan menjadi satu
_
- saya tetap menyukainya. Sebenarnya setiap urutan selain ruang terdepan / tertinggal - yang secara otomatis terpotong (yang juga, saya pikir, merupakan perilaku yang bermanfaat) . Terima kasih kepada Gilles karena menunjukkan ini.Ini hanya menggunakan pemisah bidang internal untuk memisahkan bidang.
Ini cukup ... cerewet ...
...Oh man. Saya tahu tab itu murah, tapi saya pikir itu setidaknya pintar. Sekarang saya baru saja terlambat ke pesta ...
sumber
IFS
$expand
bukan (ex pand)) dan hal ifsws baru saja disebutkan. Lihat di sini-exec
dengan-execdir
. Å Kelainan lainIFS
yang tidak Anda sebutkan adalah spasi tambahan dihapus. Perhatikan bahwa karena orang lain telah memperhatikan Anda juga perlu-T
opsimv
, karena ketika targetmv
panggilan adalah direktori yang ada.sh -c 'mkdir -p ../newtree/"$0"; ln "$0"/* ../newtree/$0 {} \;
dan gumpalan lain padafind -type d
perintah untuk membuat pohon hardlink cermin dan kemudian beroperasi pada itu, tapi saya menebak kedua menulis kode-golf sama sekali untuk operasi bergerak. Poin bagus tentang ruang terkemuka / tertinggal, meskipun saya pikir itu juga merupakan perilaku yang saya inginkan.zsh
's fungsi builtinzmv
misalnya.PHP,
147145 byte,21 spasis-> 146fungsi rekursif. Jalankan dengan
s(".");
Ulangi
glob
hasil untuk jalur yang diberikan:sumber
Ruby 121
sumber
gam3.rb:5:in `rename': Directory not empty - ./Te stSub or ./Te_stSub (Errno::ENOTEMPTY) from gam3.rb:5 from /usr/lib/ruby/1.8/find.rb:39:in `find' from /usr/lib/ruby/1.8/find.rb:38:in `catch' from /usr/lib/ruby/1.8/find.rb:38:in `find' from gam3.rb:3
Python, 187
165, ditambah 22 poin penalti untuk ruang.
166, menggunakan trik Emanuele :
Hanya satu ruang dalam yang ini!
sumber
LiveScript - 166
(Ganti spasi dengan tab.)
Berdasarkan nderscore ini versi yang dioptimalkan dari CPU1 's jawaban .
sumber
Bash 4+ 111 byte
sumber
Groovy, 139 karaktermenurut komentar @ edc65
Groovy, menangani tabrakan, 259 karakter
sumber
POSIX (Diuji pada zsh) + perintah Linux dasar 151
sumber
$(ls -CR)
benar-benar palsu. The-c
pilihan adalah tidak berguna, dan-R
membuat Anda file tanpa direktori mereka, yang sia-sia. Arsitektur Anda secara mendasar tidak akan menangani nama file yang mengandung baris baru. Anda perluset -f
atau nama file yang berisi wildcard akan meledak.export
tidak berguna. Samar-samar saya bisa melihat apa yang Anda coba lakukan untuk menyatukan file, tetapi perpipaannya salah.