ls komutu: nasıl özyinelemeli tam yol listesi, dosya başına bir satır alabilirim?


493

Her satırda bir özyinelemeli yolların düz bir listesi tükürmek için nasıl ls alabilirim?

Örneğin, tam yollarıyla dosyaların düz bir listesini istiyorum:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 Neredeyse ihtiyacım olanı yapıyor ama yol parçaları istemiyorum, tam yol istiyorum.


Ayrıca bakınız: ağaç
dreftymac

Yanıtlar:


386

Gerçekten kullanmak istiyorsanız ls, çıktısını awk kullanarak biçimlendirin:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

5
@dreftymac, bu, nesnel olarak, yazdığınız soruya kasıtlı olarak ya da değil, doğru cevap olduğu anlamına gelir. Evet, muhtemelen yazmayı umduğunuz sorunun doğru cevabı değildi . Ve daha büyük noktanıza katılırken: "bilge aya işaret ettiğinde, aptal parmağa bakar", özellikle kriterlerin olası belirsizliği olmadığında, doğruluğu değerlendirmek için öznelliğin etkisini en aza indirmemiz adil olur.
lurscher

1
@ dreftymac, oyumu değiştirmekten memnuniyet duyarım, ama şimdi kilitli, oylamayı güncelleyebilmem için soruyu düzenlemeniz gerekiyor
lurscher

7
Birisi yukarıdaki awkifadeleri açıklayabilir mi?
Mert Nuhoğlu

2
Bu çözüm dizinleri
atlamaz

2
Teşekkürler. Btw, hızlı kopyalama ve yapıştırma için bunu 1 satırda yapmak güzel olurdu.
Leo Ufimtsev

567

Find kullanın:

find .
find /home/dreftymac

Yalnızca dosya istiyorsanız (dizinleri, cihazları vb. Atlayın):

find . -type f
find /home/dreftymac -type f

2
olabilir lsparametreler gibi --sort=extensionbu çözüm "itfa"?
n611x007

Hatta bağlamsal bilgileri görüntülemek için printf çıktısını bile kullanabilirsiniz (ör. Find. -Type f -printf '% p% u \ n')
xsubira

Bu bir falg ile biçimlendirilebilir mi? yani. python pprint.pprint (dosya)
Nathan

72

ls -ld $(find .)

Çıktınızı değiştirme zamanına göre sıralamak istiyorsanız:

ls -ltd $(find .)


11
-bash: / bin / ls: Bağımsız değişken listesi çok uzun
jperelli

1
+1, 12106 dosya ile benim için çalıştı ve 19--sort=extensionls
22'de

3
Teşekkürler. Bu (güzel ve kısa) sözdizimini kendim düşünmezdim - kullanardım find . -name "*" -exec ls -ld '{}' \;(bir dosya sayısı ne olursa olsun çalışır), ama komutunuz yazmak için daha kısa;)
SRG

1
ls -ld $ (find.) dosyaları boşlukları olan bir ntfs disk listeleme eğer benim için tatili: ls: erişilemiyor ./System: Böyle bir dosya veya dizin ancak @SRG tarafından alıntılar ile bulabilirsiniz
kuz8

Daha kısa bir alternatif (ihtiyaçlarınıza bağlı olarak) olacaktır find . -ls.
IanS

59

Aşağıdaki basit yolu deneyin:

find "$PWD"

9
find "`pwd`"yol boşluk veya başka özel karakterler içeriyorsa.
mustafa.0x

7
Bunun farkı find .nedir? -.-
Salman von Abbas

7
@SalmanPK Başlamak gibi mutlak bir yol bulursanız pwd, mutlak yollar yazdırır. Bu arada, "Bu nasıl farklı find" ;-)
yckart

44

En iyi komut: tree -fi

Dosyaları kullanmak, ancak bağlantıları kullanmak >için çıktıdan kaldırmanız gerekir:

tree -fi |grep -v \>

Her dosyanın doğasını bilmek istiyorsanız, (örneğin yalnızca ASCII dosyalarını okumak için) iki whiles ile:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

Teşekkür ederim, bilmiyordum tree!
Dan Filimon

@Nakilon en yakın şey nedir? Çıktı benzer şekilde mi görüntüleniyor? Kısa bir komutla benzer çıktıyı nasıl kolayca gösterirdiniz ?
om01

6
@ om01: osx brew install treeüzerinde homebrew kullandığınız göz önüne alındığında zor
ccpizza

münhasır dosyaları listeleyemedim. her zaman dizinleri de listeler. bunu nasıl yapabilirim?
kommradHomer

Bu çok daha yüksek olarak derecelendirilmelidir!
der_grund

44

Oh, gerçekten uzun bir cevap listesi. Çok yardımcı oldu ve son olarak, aradığım kendimi yarattım:

Bir dizindeki ve alt dizinlerindeki tüm dosyaları listelemek için:

find "$PWD" -type f

Bir dizindeki tüm dizinleri ve alt dizinlerini listelemek için:

find "$PWD" -type d

Bir dizindeki ve alt dizinlerindeki Tüm Dizinleri ve Dosyaları Listelemek İçin:

find "$PWD"

2
Ve uzantıya göre filtrelemek için:find "$PWD" -type f | grep '\.json$'
Killroy

2
Grep ile sonradan işleme gerek yok, -name komutunu aşağıdaki gibi kullanın: find "$ PWD" -type f -name * .json ve listelenen dosyaları silmek istiyorsanız: "$ PWD" -type f -name * bulun .json -exec rm {} \; benzer şekilde, kopyalamak istiyorsanız rm yerine cp ve destination yazın: -exec cp {} destination
Godfather

18

Tam yolu bilmiyorum, ama -Rözyineleme için kullanabilirsiniz . Alternatif olarak, eğilmediyseniz, lsyapabilirsiniz find *.


16

Ls dışında harici komutlar kullanma:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done


Bilinmeyen seçenek '-1'. Durduruluyor.
ilw

15
du -a

Bul / yerleştir bulunmayan bazı sınırlı cihaz kabukları için kullanışlıdır.


1
herhangi bir fikir nasıl wihtout dosya boyutu kaldırabilirim awk?
Arnold Roa


10

Karmaşık yapma. Sadece bunu kullandım ve güzel bir çıktı aldım:

ls -lR /path/I/need

3
OP tam yol istiyor ve başka bir şey istemiyor. ls -lRbu hedefe ulaşmaz.
codeforester

üzgünüm, bunu yapmaz
Aryeh Beitz

9

Gelecekteki tüm insanlar için en kolay yol:

du

Ancak bu, her klasörde bulunan boyutun boyutunu da gösterir. Yalnızca klasör adını çıkarmak için awk kullanabilirsiniz:

du | awk '{print $2}'

Edit- Üzgünüm üzgünüm. Sadece ihtiyaç duyulan klasörler olduğunu düşündüm. Gelecekte herhangi birinin buna ihtiyacı olması durumunda bunu burada bırakacağım ...


İlginç, çünkü bana bilmek istediğim şeyleri gösterdi - Google'ın önerdiği gibi. Her dosyanın ne kadar yer kapladığını bilmek hoşuma gidiyor.
Jake Toronto

9

Tüm olası ls seçeneklerini kullanma özgürlüğüne sahip olarak:

find -type f | xargs ls -1


9

Düz bir liste için en iyi yol olduğunu düşünüyorum:

find -D tree /fullpath/to-dir/ 

(veya bir txt dosyasına kaydetmek için)

find -D tree /fullpath/to-dir/ > file.txt

3
Mac OS 10.13.3 üzerinde denendi. find: illegal option -- D
Jayant Bhawal

8

Aşağıdaki formatta bir bash komutu çalıştırın:

find /path -type f -exec ls -l \{\} \;

6

Dizin adlarını gösteren kısmi bir cevap.

ls -mR * | sed -n 's/://p'

Açıklama:

ls -mR * ':' ile biten tam dizin adlarını listeler, ardından o dizindeki dosyaları ayrı olarak listeler

sed -n 's/://p' iki nokta üst üste ile biten çizgiler bulur, iki nokta üst üste keser ve satır yazdırır

Dizin listesi üzerinden yineleyerek, dizinleri de bulabilmeliyiz. Hala çalýţýyor. Joker karakterleri xargs üzerinden almak zor bir iştir.


büyük cevap .. tam olarak ne ihtiyacım var!
Selvin

5

Bir ls dizininin sonuna joker karakter eklemek tam yolları zorlar. Şu anda buna sahipsiniz:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

Bunun yerine şunları yapabilirsiniz:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

Ne yazık ki bu, yinelenen dizinler için tam yolu yazdırmaz, bu nedenle aradığınız tam çözüm olmayabilir.


Ayrıca maalesef bir joker karakterle sudo yapamazsınız (çünkü joker karakter normal kullanıcı olarak genişletilir).
andrew lorien

4

Birçok cevap görüyorum. Bu benim ve Mac üzerinde çalışıyorsanız oldukça yararlı olduğunu düşünüyorum.

Eminim ki bazı "paket" dosyaları ( .app , .rtfd , .workflow , vb.) Vardır . Ve Finder'ın penceresine baktıklarında tek bir dosya gibi görünürler. Ama değiller. Ve $ lsya da $ findonları dizin olarak görün ... Yani, içeriklerini de listelemeniz gerekmedikçe, bu benim için çalışır:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

Tabii ki bu çalışma direktörü içindir ve diğer paketlerin uzantılarını da ekleyebilirsiniz (ancak her zaman bir ardışık ile /). Veya paket olmadan paket yoksa/ .

Oldukça ilginç " .lpdf/" (çok dilli pdf). .pdfFinder'da normal " " uzantısına (!!) sahip veya hiç yok. Bu şekilde bunun için olsun (ya da sadece 1 dosya sayar) pdfve bir sürü şey değil…


4

ls -lR aradığın şey, ya da en azından ben öyleydim. şerefe


OP tam yol istiyor ve başka bir şey istemiyor. ls -lRbu hedefe ulaşmaz.
Hadrien TOMA

3

Dizin göreli bir yol olarak iletilirse ve find komutunu çağırmadan önce dizini mutlak bir yola dönüştürmeniz gerekir. Aşağıdaki örnekte, dizin komut dosyasına ilk parametre olarak iletilir:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

Sisteminiz varsa readlinkyapabileceğinizdirectory=$(readlink -e $1)
bir sonraki duyuruya kadar durdurulmuş.

Doğru, ancak cd / pwd kombinasyonu her sistemde çalışır. readlinkOS X 10.5.8'de -e seçeneğini desteklemez.
John Keyes

3
tar cf - $PWD|tar tvf -             

Bu yavaştır ancak özyinelemeli olarak çalışır ve hem dizinleri hem de dosyaları yazdırır. Diğer tüm bilgi / dizinler olmadan dosya adlarını istiyorsanız awk / grep ile bağlayabilirsiniz:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

2
ayrıca şunları da kullanabilirsiniz: tar cvf / dev / null $ PWD
RuleB

2

@ ghostdog74: Çözümünüzle küçük ince ayar yapın.
Aşağıdaki kod, tam yolu ile dosya aramak için kullanılabilir.

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

1

Dosya adını biliyordum ama dizini de istedim.

$ PWD bulmak | fgrep dosya adı

Mac OS 10.12.1'de mükemmel çalıştı

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.