Perintah ls: bagaimana saya bisa mendapatkan daftar jalur penuh rekursif, satu baris per file?

493

Bagaimana saya bisa mengeluarkan ls daftar jalan satu per baris rekursif?

Sebagai contoh, saya hanya ingin daftar datar file dengan path lengkap mereka:

/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 hampir melakukan apa yang saya butuhkan, tetapi saya tidak ingin jalan fragmen, saya ingin jalur penuh.

dreftymac
sumber
Lihat juga: tree
dreftymac

Jawaban:

386

Jika Anda benar-benar ingin menggunakan ls, maka format outputnya menggunakan awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
ghostdog74
sumber
5
@dreftymac, yang berarti bahwa ini, secara objektif, adalah jawaban yang tepat untuk pertanyaan yang Anda tulis, sengaja atau tidak. Ya, mungkin itu bukan jawaban yang tepat untuk pertanyaan yang Anda harapkan telah ditulis. Dan sementara saya setuju dengan poin Anda yang lebih besar: "ketika orang bijak menunjuk ke bulan, orang bodoh menatap jari" itu adil bahwa kami meminimalkan dampak subjektivitas untuk mengevaluasi kebenaran, khususnya ketika kriteria tidak memiliki kemungkinan ambiguitas yang mungkin.
lurscher
1
@dreftymac, saya akan dengan senang hati mengubah suara saya, tetapi sekarang terkunci, Anda perlu mengedit pertanyaan sehingga saya dapat memperbarui suara
lurscher
7
Bisakah seseorang tolong jelaskan awkungkapan di atas ?
Mert Nuhoglu
2
Solusi ini tidak menghilangkan direktori (setiap direktori mendapatkan barisnya sendiri)
JayB
2
Terima kasih. Btw, akan menyenangkan untuk memiliki ini dalam 1 baris untuk copy & paste cepat
Leo Ufimtsev
567

Gunakan temukan:

find .
find /home/dreftymac

Jika Anda hanya menginginkan file (mengabaikan direktori, perangkat, dll):

find . -type f
find /home/dreftymac -type f
Stefan
sumber
2
dapat lsparameter seperti --sort=extension"ditebus" oleh solusi ini?
n611x007
Anda bahkan dapat menggunakan output printf untuk menampilkan informasi kontekstual yang diperlukan (mis. Temukan. -Type f -printf '% p% u \ n')
xsubira
Bisakah ini diformat dengan falg? yaitu. python pprint.pprint (file)
Nathan
72

ls -ld $(find .)

jika Anda ingin mengurutkan output berdasarkan waktu modifikasi:

ls -ltd $(find .)

lainnya
sumber
11
-bash: / bin / ls: Daftar argumen terlalu panjang
jperelli
1
+1 bekerja untuk saya dengan 12106 file, dan saya bisa menggunakan --sort=extensionparameterls
n611x007
3
Terima kasih. Saya tidak akan berpikir sendiri tentang sintaks (baik dan pendek) - saya akan menggunakan find . -name "*" -exec ls -ld '{}' \;(yang bekerja berapa pun jumlah file), tetapi perintah Anda jauh lebih pendek untuk ditulis;)
SRG
1
ls -ld $ (find.) istirahat untuk saya jika saya mendaftarkan disk ntfs di mana file memiliki ruang: ls: tidak dapat mengakses ./Sistem: Namun tidak ada file atau direktori seperti itu yang ditemukan dengan kutipan oleh karya
@SRG
Alternatif yang lebih pendek (tergantung kebutuhan Anda) adalah find . -ls.
IanS
59

Coba cara sederhana berikut ini:

find "$PWD"
Ivan Alegre
sumber
9
find "`pwd`"jika path berisi spasi atau beberapa karakter khusus lainnya.
mustafa.0x
7
Bagaimana ini berbeda dari find .? -.-
Salman von Abbas
7
@SalmanPK Jika Anda memberikan menemukan jalur absolut seperti pwdmemulai, itu akan mencetak jalur absolut. Ngomong-ngomong, "Apa bedanya dengan find" ;-)
yckart
44

Perintah terbaik adalah: tree -fi

Untuk menggunakan file tetapi bukan tautannya, Anda harus menghapus >dari output Anda:

tree -fi |grep -v \>

Jika Anda ingin mengetahui sifat dari setiap file, (untuk membaca hanya file ASCII misalnya) dengan dua whiles:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done
kerkael
sumber
Terima kasih, saya tidak tahu tree!
Dan Filimon
@Nakilon hal apa yang paling dekat? Apakah ini menampilkan output yang sama? Bagaimana Anda akan dengan mudah menampilkan output serupa dengan perintah pendek ?
om01
6
@ om01: di osx itu sulit brew install tree, mengingat Anda menggunakan homebrew
ccpizza
saya tidak bisa mencantumkan file exclusivelty. itu selalu mencantumkan direktori juga. bagaimana saya bisa melakukan itu
kommradHomer
Ini harus dinilai jauh lebih tinggi!
der_grund
44

Oh, benar-benar daftar jawaban yang panjang. Ini sangat membantu dan akhirnya, saya membuat sendiri yang saya cari:

Untuk Mendaftar Semua File dalam direktori dan sub-direktori:

find "$PWD" -type f

Untuk Mendaftar Semua Direktori di direktori dan sub-direktori:

find "$PWD" -type d

Untuk Mendaftar Semua Direktori dan File dalam direktori dan sub-direktori:

find "$PWD"
Ayah baptis
sumber
2
Dan untuk memfilter dengan ekstensi:find "$PWD" -type f | grep '\.json$'
Killroy
2
Tidak Perlu post-processing dengan grep, gunakan -name di find seperti: find "$ PWD" -type f -name * .json dan jika Anda ingin menghapus file yang terdaftar: find "$ PWD" -type f -name * .json -exec rm {} \; sama halnya, jika Anda ingin menyalinnya maka ganti rm dengan cp dan tujuan: -exec cp {} destination
Godfather
18

Saya tidak tahu tentang path lengkap, tetapi Anda dapat menggunakan -Runtuk rekursi. Atau, jika Anda tidak membungkuk ls, Anda bisa melakukannya find *.

Justin Johnson
sumber
16

Tidak menggunakan perintah eksternal selain ls:

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

Idelic
sumber
Opsi tidak dikenal '-1'. Batalkan
ilw
15
du -a

Berguna untuk beberapa cangkang alat terbatas di mana menemukan / menemukan tidak tersedia.

Rob D
sumber
1
tahu bagaimana saya bisa menghapus filesize tanpa awk?
Arnold Roa
12

temukan / akan lakukan triknya

Dmitry
sumber
10

Jangan membuatnya rumit. Saya hanya menggunakan ini dan mendapat hasil yang bagus:

ls -lR /path/I/need
KellyC
sumber
3
OP hanya menginginkan jalur penuh dan tidak ada yang lain. ls -lRtidak akan memenuhi tujuan itu.
codeforester
maaf, itu tidak melakukannya
Aryeh Beitz
9

Cara termudah untuk semua orang di masa depan adalah:

du

Namun, ini juga menunjukkan ukuran whats yang terkandung dalam setiap folder. Anda dapat menggunakan awk untuk hanya menampilkan nama folder:

du | awk '{print $2}'

Sunting- Maaf maaf, salah saya. Saya pikir hanya folder yang diperlukan. Aku akan meninggalkan ini di sini kalau-kalau ada orang di masa depan yang membutuhkannya ...

6112115
sumber
Menarik, karena itu menunjukkan kepada saya hal-hal yang saya tidak tahu, saya ingin tahu - seperti yang disarankan Google. Ternyata, saya suka mengetahui berapa banyak ruang yang dibutuhkan setiap file.
Jake Toronto
9

Dengan memiliki kebebasan menggunakan semua opsi ls yang memungkinkan:

find -type f | xargs ls -1

Grzegorz Luczywo
sumber
9

Saya pikir untuk daftar datar, cara terbaik adalah:

find -D tree /fullpath/to-dir/ 

(atau untuk menyimpannya dalam file txt)

find -D tree /fullpath/to-dir/ > file.txt
Dimitrios
sumber
3
Sudah mencoba di Mac OS 10.13.3. find: illegal option -- D
Jayant Bhawal
8

Jalankan perintah bash dengan format berikut:

find /path -type f -exec ls -l \{\} \;
Denio Mariz
sumber
6

Berikut adalah sebagian jawaban yang menunjukkan nama direktori.

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

Penjelasan:

ls -mR * daftar nama direktori lengkap yang diakhiri dengan ':', lalu daftarkan file dalam direktori tersebut secara terpisah

sed -n 's/://p' menemukan garis yang berakhir pada titik dua, melepaskan tanda titik dua dan mencetak garis

Dengan mengulangi daftar direktori, kita harus dapat menemukan direktori juga. Masih mengerjakannya. Merupakan tantangan untuk mendapatkan wildcard melalui xargs.

Kevin
sumber
jawaban yang bagus .. persis apa yang saya butuhkan!
Selvin
5

Menambahkan wildcard ke akhir direktori ls memaksa path penuh. Sekarang Anda memiliki ini:

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

Anda bisa melakukan ini sebagai gantinya:

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

Sayangnya ini tidak mencetak path lengkap untuk direktori yang diulang, jadi ini mungkin bukan solusi lengkap yang Anda cari.

koeselitz
sumber
Sayangnya, Anda tidak dapat menggunakan sudo ls dengan wildcard (karena wildcard diperluas sebagai pengguna biasa).
andrew lorien
4

Banyak jawaban yang saya lihat. Ini milik saya, dan saya pikir cukup berguna jika Anda bekerja di Mac.

Saya yakin Anda tahu ada beberapa "bundel" file ( App , .rtfd , .workflow , dan sebagainya). Dan melihat jendela Finder mereka tampak file tunggal. Tetapi mereka tidak. Dan $ lsatau $ findmelihatnya sebagai direktori ... Jadi, kecuali Anda perlu membuat daftar isinya juga, ini berfungsi untuk saya:

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

Tentu saja ini untuk dir yang berfungsi, dan Anda bisa menambahkan ekstensi bundel lain (tetapi selalu dengan /setelahnya). Atau ekstensi lain jika bukan bundel tanpa ekstensi /.

Agak menarik " .lpdf/" (pdf multibahasa). Ini memiliki .pdfekstensi " " normal (!!) atau tidak ada di Finder. Dengan cara ini Anda mendapatkan (atau hanya menghitung 1 file) untuk ini pdfdan bukan banyak hal ...

Steve
sumber
4

ls -lR adalah apa yang Anda cari, atau setidaknya saya. Bersulang

sivi
sumber
OP hanya menginginkan jalur penuh dan tidak ada yang lain. ls -lRtidak akan memenuhi tujuan itu.
Hadrien TOMA
3

Jika direktori dilewatkan sebagai jalur relatif dan Anda harus mengubahnya menjadi jalur absolut sebelum memanggil find. Dalam contoh berikut, direktori dilewatkan sebagai parameter pertama ke skrip:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
John Keyes
sumber
Jika sistem readlinkAnda memiliki yang dapat Anda lakukandirectory=$(readlink -e $1)
Dijeda sampai pemberitahuan lebih lanjut.
Benar, tetapi kombinasi cd / pwd akan bekerja pada setiap sistem. readlinkpada OS X 10.5.8 tidak mendukung opsi -e.
John Keyes
3
tar cf - $PWD|tar tvf -             

Ini lambat tetapi bekerja secara rekursif dan mencetak direktori dan file. Anda dapat mem-pipe-nya dengan awk / grep jika Anda hanya ingin nama file tanpa semua info / direktori lain:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          
AturanB
sumber
2
Anda juga dapat menggunakan: tar cvf / dev / null $ PWD
RuleB
2

@ ghostdog74: Tweak kecil dengan solusi Anda.
Kode berikut dapat digunakan untuk mencari file dengan path absolut penuhnya.

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]
Chaitanya
sumber
1

Saya tahu nama file tetapi menginginkan direktori juga.

cari $ PWD | nama file fgrep

bekerja dengan baik di Mac OS 10.12.1

hpj
sumber