Saya menggunakan ls -a
perintah untuk mendapatkan nama file dalam direktori, tetapi hasilnya dalam satu baris.
Seperti ini:
. .. .bash_history .ssh updater_error_log.txt
Saya memerlukan alternatif bawaan untuk mendapatkan nama file, masing-masing pada baris baru, seperti ini:
.
..
.bash_history
.ssh
updater_error_log.txt
ls
ke python,ls
akan menampilkan satu file per baris seperti yang saya jelaskan dalam jawaban saya.ls
output kepython
dan mengamati output single-line di python?Jawaban:
Gunakan
-1
opsi (perhatikan ini digit "satu", bukan huruf kecil "L"), seperti ini:Namun, pertama-tama, pastikan
ls
dukungan Anda-1
. GNU coreutils (diinstal pada sistem Linux standar) dan Solaris lakukan; tetapi jika ragu, gunakanman ls
atauls --help
atau periksa dokumentasi. Misalnya:sumber
ls --help
output ... selalu diinstal ;-)linux ls one file per line
dan ini adalah artikel teratas. Tidak dapat percaya betapa bertele-tele jawaban yang dipilih adalah atau bahwa jawaban ini memiliki lebih sedikit suara daripada yang menyumbang.ls -1
ftw.ls
default ke-1
perilaku ketika output tidak terhubung ke terminal.Ya, Anda dapat dengan mudah membuat
ls
output satu nama file per baris:Penjelasan: Perintah
ls
merasakan jika output ke terminal atau ke file atau pipa dan menyesuaikan sesuai.Jadi, jika Anda mem
ls -a
- pipe ke python, ia seharusnya bekerja tanpa tindakan khusus.sumber
ls
hanya beberapa versi yang tidak didukung sehingga tidak mendukung-1
.
dan..
"file" yang ditampilkan di output?Ls dirancang untuk konsumsi manusia, dan Anda tidak boleh menguraikan hasilnya .
Dalam skrip shell, ada beberapa kasus di mana parsing output ls berfungsi adalah cara paling sederhana untuk mencapai efek yang diinginkan. Karena ls dapat membuat non-ASCII dan mengontrol karakter dalam nama file, case-case ini adalah himpunan bagian dari mereka yang tidak memerlukan untuk mendapatkan nama file dari
ls
.Dalam python, sama sekali tidak ada alasan untuk memohon
ls
. Python memiliki semuals
fungsionalitas bawaan. Gunakanos.listdir
untuk membuat daftar isi direktori danos.stat
atauos
untuk mendapatkan metadata file. Fungsi lain dalamos
modul juga mungkin relevan dengan masalah Anda.Jika Anda mengakses file jarak jauh melalui ssh, cara daftar nama file yang cukup kuat adalah melalui sftp:
Ini mencetak satu nama file per baris, dan tidak seperti
ls
utilitas,sftp
tidak membuat karakter yang tidak dapat dicetak . Anda masih tidak dapat membuat daftar direktori dengan andal di mana nama file berisi baris baru, tapi itu jarang dilakukan (ingat ini sebagai masalah keamanan potensial, bukan masalah kegunaan).Dengan python (berhati-hatilah bahwa karakter meta shell harus lolos
remote_dir
):Untuk interaksi yang lebih kompleks, lihat mode batch sftp dalam dokumentasi.
Pada beberapa sistem (Linux, Mac OS X, mungkin beberapa unix lain, tapi jelas bukan Windows), pendekatan yang berbeda adalah memasang sistem file jarak jauh melalui ssh dengan sshfs , dan kemudian bekerja secara lokal.
sumber
kamu bisa memakai
ls -1
ls -l
juga akan melakukan pekerjaansumber
ls -l
tidak boleh digunakan.Mudah, asalkan nama file Anda tidak menyertakan baris baru:
Jika Anda mem-pipkan ini ke perintah lain, Anda mungkin sebaiknya memilih nama file Anda dengan null bytes, daripada baris baru, karena null byte tidak dapat terjadi dalam nama file (tetapi baris baru mungkin):
Mencetak pada terminal mungkin akan ditampilkan sebagai satu baris, karena null byte biasanya tidak dicetak. Beberapa program mungkin memerlukan opsi khusus untuk menangani masukan nol-koma, seperti
sort
's-z
. Skrip Anda sendiri juga perlu menjelaskan hal ini.sumber