Linux'ta çıktı satırı başına bir dosya adını nasıl listeleyebilirim?


230

ls -aBir dizindeki dosya adlarını almak için komut kullanıyorum , ancak çıktı tek bir satırda.

Bunun gibi:

.  ..  .bash_history  .ssh  updater_error_log.txt

Dosya adlarını, her biri yeni bir satırda almak için yerleşik bir alternatife ihtiyacım var:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

3
İnsan tüketimine ilişkin bir liste görüntülemesi amaçlanmıştır. Ls'yi başka bir amaçla kullanıyorsanız (örneğin, bir komut dosyasındaki yinelenen dosyaların listesini almak için), kesinlikle yanlış aracı kullanıyorsunuz demektir.
Juliano

2
@juliano - Aslında bir python betiği tarafından tüketilmelidir. Neden yanlış bir araç diyorsun?
fixxxer

1
@fixxer an boru lspiton için, lsirade çıktı satır başına bir dosya benim cevap açıklandığı gibi.
Peter

6
@fixxxer: O zaman gerçekten yanlış kullanıyorsunuz. Kullanıcı terminalindeki çıktıların listesini biçimlendirir. Bu dosya özel karakterler yerine geçebilir, diğer bir deyişle vb özel bir anlamı, ... sahip karakterler ihmal edebilir, ls biçimlendirir kullanıcıya bir liste. Biçimlendirilmemiş dosya adları istiyorsunuz. Python 'glob' modülünü kullanmamanızın özel bir nedeni var mı? docs.python.org/library/glob.html 'fnmatch', 'dircache' ve diğerleri de vardır.
Juliano

@fixxer aslında yaptınız mı lshiç çıkışına pythonve Python tek hat çıkışı gözlendi?
Peter

Yanıtlar:


431

-1Seçeneği kullanın (bunun "bir" basamak olduğunu, küçük harf "L" olmadığını unutmayın), şöyle:

ls -1a

İlk olarak, lsdesteklerinizin olduğundan emin olun -1. GNU coreutils (standart Linux sistemlerinde kurulu) ve Solaris; ancak şüphe durumunda kullanmak man lsveya ls --helpveya belgelere bakın. Örneğin:

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

2
+1 -1 hakkında bilmiyordum (-l evet (ell biri değil)) Adam sayfasında gösteriyor ama her zaman ell olarak okuyorum :)
slashmais

@slashmais - Ah, iyi bir nokta - kolay anlaşılır. Cevapta açıklığa kavuştum.
Bert F

1
@ dty: GNU için bunu ls --helpçıktıda belgelendirmiş olursunuz ... her zaman yüklü ;-)
Tony Delroy

3
Google'da arandı linux ls one file per lineve bu en iyi makaleydi. Seçilen cevabın ne kadar garip olduğuna ya da bu cevabın kediye yönelttiği cevaptan daha az oy olduğuna inanamıyorum. ls -1ftw.
crantok

3
ls-1çıkış terminale bağlı olmadığında varsayılan davranış şeklindedir.
codeforester

132

Evet, lsçıktıyı her satıra kolayca bir dosya adı yapabilirsiniz :

ls -a | cat

Açıklama: Komut ls, çıktının bir terminale mi, bir dosyaya mı yoksa boruya mı olduğunu algılar ve buna göre ayarlanır.

Yani, ls -apython için boru kullanıyorsanız, herhangi bir özel önlem almadan çalışmalıdır.


2
Vay be, bu harika. Kabul edilen cevaba göre avantajı - bu aslında Android / adb kabuğunda çalışıyor - burada lssadece bazı soyulmuş versiyonlar desteklenmiyor-1
mkilmanas

Çıktıda .ve ..dosyalarının gösterilmesini nasıl önlersiniz ?
matanster

@matanster: Bu duruma göre nokta dosyalarını görmek ister misiniz? Değilse, -a seçeneğini bırakın.
Peter G.

29

Ls insan tüketimi için tasarlanmıştır ve çıktısını ayrıştırmamalısınız .

Kabuk komut dosyalarında, ls çıktısının ayrıştırılmasının işe yaradığı birkaç durum vardır, istenen efekti elde etmenin en basit yoludur. Ls, ASCII olmayan ve dosya adlarındaki karakterleri kontrol edebileceğinden, bu durumlar bir dosya adı almayı gerektirmeyenlerin bir alt kümesidir ls.

Python'da, çağırmak için kesinlikle hiçbir neden yoktur ls. Python'un tüm lsişlevleri yerleşiktir. Kullan os.listdirbir dizinin içeriğini listelemek için ve os.statya osdosya meta elde etmek. osModüllerdeki diğer işlevlerin de probleminizle ilgili olması muhtemeldir.


Uzak dosyalara ssh üzerinden erişiyorsanız, dosya adlarını listelemenin oldukça sağlam bir yolu sftp'dir:

echo ls -1 | sftp remote-site:dir

Bu, her satıra bir dosya adı yazdırır ve lsyardımcı programın aksine sftpyazdırılamayan karakterleri değiştirmez. Bir dosya adının yeni satır içerdiği dizinleri güvenilir bir şekilde listeleyemezsiniz, ancak bu nadiren yapılır (bunu bir kullanılabilirlik sorunu değil, potansiyel bir güvenlik sorunu olarak unutmayın).

Python'da (kabuk metakarakterlerinin kaçması gerektiğine dikkat edin remote_dir):

command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")

Daha karmaşık etkileşimler için, belgelerde sftp'nin toplu moduna bakın.

Bazı sistemlerde (Linux, Mac OS X, belki de bazı birleşimler, ancak kesinlikle Windows değil), farklı bir yaklaşım, sshfs ile ssh aracılığıyla uzak bir dosya sistemini bağlamak ve daha sonra yerel olarak çalışmaktır.


SSH ile uzak makineye bağlıyım. Uzak makinede os.listdir gibi bir python işlevini tek bir satırda yürütmenin bir yolunu bulamadım. Dolayısıyla bu soru. Sadece dosyaları listelemek için bir senaryo yazmak istemiyorum. Bu sorunun başka bir yolu var mı?
fixxxer

@fixxxer: ssh durumu değiştiriyor, orijinal sorunuzda bahsetmeniz gereken şeyler! Bence sftp kullanım durumunuz için uygun.
Gilles 'SO- kötü olmayı kes

Karışıklık için özür dilerim. Parolayı "command_line" a da ekleyebilmemin bir yolu var mı?
fixxxer

@fixxxer: Bilmiyorum, ssh yazarları düz metin olarak saklanan şifrelerde kaşlarını çattı ve bunu kolaylaştırma eğiliminde değil. Anahtar tabanlı kimlik doğrulamasını gerçekten ayarlamanız gerekir (web üzerinde çok sayıda öğretici ve bununla ilgili superuser.com'da sorular vardır ).
Gilles 'SO- kötü olmayı bırak'

11

kullanabilirsiniz ls -1

ls -l işi de yapacak


En iyi cevap zaten söylediğin şeylerden bahsetmektedir. ayrıca özel olarak sorulan soru ls -lkullanılmamalıdır.
DevX

2

Dosya adlarınız yeni satır içermediği sürece kolay:

find . -maxdepth 1

Bunu başka bir komutla oluşturuyorsanız, büyük olasılıkla dosya adlarını yeni satırlardan ziyade boş baytlarla ayırmayı tercih etmelisiniz, çünkü bir dosya adında boş baytlar oluşamaz (ancak yeni satırlar olabilir):

find . -maxdepth 1 -print0

Boş bir bayt normalde yazdırılmadığından, terminalde yazdırılması muhtemelen tek satır olarak görüntülenir. Bazı programlar, sort' gibi boş sınırlandırılmış girdileri işlemek için belirli bir seçeneğe ihtiyaç duyabilir -z. Kendi betiğiniz de benzer şekilde bunu hesaba katmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.