Ini pertanyaan serius. Saya menguji beberapa awk
skrip dan saya perlu file dengan baris baru di namanya.
Apakah mungkin menambahkan baris baru ke nama file mv
?
Saya sekarang, saya bisa melakukan ini dengan touch
:
touch "foo
bar"
Dengan sentuhan saya menambahkan karakter baris baru per salin dan tempel. Tapi saya tidak bisa menulis foo
Returnbar
di shell saya.
Bagaimana saya bisa mengganti nama file, untuk memiliki baris baru dalam nama file?
Edit 2015/06/28; 07:08 malam
Untuk menambahkan baris baru di zsh
saya dapat menggunakan, Alt+Return
mv
akan berbeda dari melakukannya dengantouch
? Apakah Anda mencoba hal yang sama?mv
perintah semudah itutouch
.Jawaban:
Itu ide yang buruk (memiliki karakter aneh dalam nama file) tetapi Anda bisa melakukannya
(Anda bisa juga melakukan
mv somefile.txt "$(printf "foo\nbar")"
ataumv somefile.txt foo$'\n'bar
, dll ... detail khusus untuk shell Anda. Saya menggunakanzsh
)Baca lebih lanjut tentang globbing , misalnya glob (7) . Detailnya bisa spesifik untuk shell. Tapi pahami yang
/bin/mv
diberikan (oleh shell Anda), melalui execve (2) , array argumen yang diperluas : ekspansi argumen dan globbing adalah tanggung jawab shell yang memanggil.Dan Anda bahkan bisa membuat kode program C kecil untuk melakukan hal yang sama:
Simpan program di atas
foo.c
, kompilasi dengangcc -Wall foo.c -o foo
kemudian jalankan./foo
Demikian juga, Anda dapat membuat kode skrip yang serupa di Perl, Ruby, Python, Ocaml, dll ....
Tapi itu ide yang buruk. Hindari baris baru dalam nama file (itu akan membingungkan pengguna, dan itu bisa merusak banyak skrip).
Sebenarnya, saya bahkan merekomendasikan untuk menggunakan hanya huruf, angka, dan
+-/._%
karakter yang tidak ditekankan (dengan/
menjadi pemisah direktori) dalam jalur file. File "tersembunyi" (dimulai dengan.
) harus digunakan dengan hati-hati dan parcimony. Saya percaya menggunakan segala jenis ruang dalam nama file adalah kesalahan. Gunakan garis bawah sebagai gantinya (misalnyafoo/bar_bee1.txt
) atau minus (misalnyafoo/bar-bee1.txt
)sumber
foo
.@
dan,
akan lebih berbahaya daripada-
(seperti di posisi pertama) atau%
. Semua rekomendasi tersebut terutama untuk mengatasi bug di beberapa aplikasi (yang memecah nama file yang dinyatakan valid dari sudut pandang OS). Rasanya terbelakang untuk meminta orang tidak menggunakan karakter itu daripada memperbaiki bug mereka.Jika Anda menggunakan bash, perintah ini akan berfungsi.
sumber
zsh
juga =)Saya tahu Anda meminta
mv
solusi, namun, meskipun ada peringatan, ini dapat dengan mudah dilakukanrename
(dalam paket Perl):sumber
rename
, ide yang sangat bagus. +1Salah satu aspek dari masalah ini sebenarnya bukan tentang
awk
- dan hanya sedikit tentang shell. Masalahnya adalah bahwa pada standar, tty kanonik sebagian besar waktu disiplin tty kernel buffering input Anda - hanya menggemakannya ke layar Anda dan tempat lain - sehingga secara efisien dapat menangani backspacing dan sejenisnya.Namun, ketika Anda menekan kembali atau memasukkan baris baru, semua data buffer didorong sekaligus ke aplikasi membaca - biasanya shell Anda. Anda dapat mengamati ini dengan memperhatikan
$PS2
setelah memasukkan penawaran yang menggantung. Ketika shell mencetaknya,$PS2
itu karena ia baru saja membaca beberapa blok input Anda dan belum yakin Anda berhasil.Jadi, untuk kenyamanan, yang Anda butuhkan adalah beberapa cara mengirimkan
\n
ewline ke buffer terminal tanpa harus mendorong semua input lainnya segera. Cara standar untuk melakukannya adalah dengan urutan-kunciCTRL+V
- yang mengutip untuk terminal karakter input Anda selanjutnya. ApakahCTRL+V
kemudianCTRL+J
- karena yang terakhir ini biasanya cara mengetik literal\n
ewline. Anda akan tahu itu berfungsi ketika Anda tidak melihat$PS2
karena shell masih belum membaca input Anda.Catatan meskipun ketika tidak membaca bahwa masukan Anda sebelumnya
CTRL+V
akan membuat perbedaan untuk shell sama sekali - yang hanya mengutip untuk garis-disiplin. Anda pasti ingin mengutip kutipan baris baru juga untuk melakukan sesuatu yang bermakna dengannya.Ngomong-ngomong,
CTRL+V
bisa diterapkan dengan cara lain - misalnya"$(printf \\33)"
bukan satu-satunya cara untuk menulisESC
karakter ke skrip shell - dan itu bahkan bukan yang paling sederhana. Anda benar-benar dapat memasukkan karakter apa pun yang akan dikirim papan ketik Anda tanpa driver input yang berusaha menerjemahkannya jika Anda baru saja menghindarinya dengan cara ini.Saya sering suka menggunakan <tab> pada command-line tanpa shell berusaha untuk menyelesaikan apa pun. Karena shell yang melakukan penyelesaian biasanya akan mengkonfigurasi <tab> dengan cara yang sama
stty eol \t
, untuk membuat sistem penyelesaiannya bekerja,CTRL+V
bekerja untuk saya bahkan di lingkungan yang tidak dikenal.sumber