Lệnh ls: làm thế nào tôi có thể nhận được một danh sách đường dẫn đệ quy, một dòng trên mỗi tệp?


493

Làm cách nào tôi có thể nhận ls để đưa ra một danh sách phẳng các đường dẫn một dòng trên đệ quy?

Ví dụ, tôi chỉ muốn một danh sách phẳng các tệp có đường dẫn đầy đủ của chúng:

/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 hầu như làm những gì tôi cần, nhưng tôi không muốn các đoạn đường dẫn, tôi muốn các đường dẫn đầy đủ.


Xem thêm: cây
dreftymac

Câu trả lời:


386

Nếu bạn thực sự muốn sử dụng ls, sau đó định dạng đầu ra của nó bằng awk:

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

5
@dreftymac, có nghĩa là, nói một cách khách quan, câu trả lời đúng cho câu hỏi mà bạn đã viết, cố ý hay không. Vâng, có thể đó không phải là câu trả lời đúng cho câu hỏi mà bạn hy vọng đã viết. Và trong khi tôi đồng ý với quan điểm lớn hơn của bạn: "khi người khôn ngoan chỉ mặt trăng, kẻ ngốc nhìn vào ngón tay" thì thật công bằng khi chúng ta giảm thiểu tác động của tính chủ quan để đánh giá tính đúng đắn, đặc biệt khi tiêu chí không có bất kỳ sự mơ hồ nào có thể xảy ra
lurscher

1
@dreftymac, tôi sẽ vui mừng thay đổi phiếu bầu của mình, nhưng hiện tại nó đã bị khóa, bạn cần chỉnh sửa câu hỏi để tôi có thể cập nhật phiếu bầu
lurscher

7
Ai đó có thể vui lòng giải thích các awkbiểu thức trên ?
Mert Nuooselu

2
Giải pháp này không bỏ sót các thư mục (mỗi thư mục có dòng riêng)
JayB

2
Cảm ơn. Btw, sẽ rất tuyệt nếu có dòng này trong 1 dòng để sao chép và dán nhanh.
Leo Ufimtsev

567

Sử dụng tìm:

find .
find /home/dreftymac

Nếu bạn chỉ muốn tệp (bỏ qua thư mục, thiết bị, v.v.):

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

2
có thể lscác thông số như --sort=extension"cứu chuộc" bởi giải pháp này?
n611x007

Bạn thậm chí có thể sử dụng đầu ra printf để hiển thị thông tin theo ngữ cảnh cần thiết (ví dụ: find. -Ape f -printf '% p% u \ n')
xsubira

Điều này có thể được định dạng với một falg? I E. python pprint.pprint (tập tin)
Nathan

72

ls -ld $(find .)

nếu bạn muốn sắp xếp đầu ra của mình theo thời gian sửa đổi:

ls -ltd $(find .)


11
-bash: / bin / ls: Danh sách đối số quá dài
jperelli

1
+1 hoạt động với tôi với 12106 tệp và tôi có thể sử dụng --sort=extensiontham số củals
n611x007

3
Cảm ơn. Tôi sẽ không tự mình nghĩ về cú pháp (đẹp và ngắn) đó - tôi sẽ sử dụng find . -name "*" -exec ls -ld '{}' \;(cái đó hoạt động với số lượng tệp là bao nhiêu), nhưng lệnh của bạn ngắn hơn để viết;)
SRG

1
ls -ld $ (tìm.) phá vỡ đối với tôi nếu tôi liệt kê một đĩa ntfs nơi các tập tin có các khoảng trống: ls: không thể truy cập ./System: Không có tập tin hoặc thư mục như vậy tuy nhiên tìm thấy với trích dẫn của @SRG làm việc
kuz8

Một sự thay thế ngắn hơn (tùy thuộc vào nhu cầu của bạn) sẽ là find . -ls.
IanS

59

Hãy thử cách đơn giản sau:

find "$PWD"

9
find "`pwd`"nếu đường dẫn chứa khoảng trắng hoặc một số ký tự đặc biệt khác.
mustafa.0x

7
Làm thế nào là khác nhau hơn find .? -.-
Salman von Abbas

7
@SalmanPK Nếu bạn tìm thấy một đường dẫn tuyệt đối muốn pwdbắt đầu, nó sẽ in các đường dẫn tuyệt đối. Nhân tiện, "Làm thế nào điều này khác với find" ;-)
yckart

44

Lệnh tốt nhất là: tree -fi

Để sử dụng các tệp nhưng không phải các liên kết, bạn phải xóa >khỏi đầu ra của mình:

tree -fi |grep -v \>

Nếu bạn muốn biết bản chất của từng tệp, (chỉ đọc các tệp ASCII) với hai whiles:

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

Cảm ơn bạn, tôi đã không biết về tree!
Dan Filimon

@Nakilon những gì gần nhất? Nó hiển thị đầu ra tương tự? Làm thế nào bạn có thể dễ dàng hiển thị đầu ra tương tự với một lệnh ngắn ?
om01

6
@ om01: trên osx thật khó khăn brew install tree, vì bạn đang sử dụng homebrew
ccpizza

tôi không thể liệt kê các tập tin độc quyền. nó luôn luôn liệt kê các thư mục quá. Làm thế nào tôi có thể làm điều đó?
kommradHome

Điều này nên được đánh giá cách cao hơn!
der_grund

44

Oh, thực sự là một danh sách dài các câu trả lời. Nó đã giúp rất nhiều và cuối cùng, tôi đã tạo ra thứ mà tôi đang tìm kiếm:

Để liệt kê tất cả các tệp trong một thư mục và các thư mục con của nó:

find "$PWD" -type f

Để liệt kê tất cả các thư mục trong một thư mục và các thư mục con của nó:

find "$PWD" -type d

Để liệt kê tất cả các thư mục và tệp trong một thư mục và các thư mục con của nó:

find "$PWD"

2
Và để lọc theo tiện ích mở rộng:find "$PWD" -type f | grep '\.json$'
Killroy

2
Không cần xử lý hậu kỳ với grep, hãy sử dụng -name trong find like: find "$ PWD" -type f -name * .json và nếu bạn muốn xóa các tệp được liệt kê: tìm "$ PWD" -type f -name * .json -exec rm {} \; tương tự, nếu bạn muốn sao chép nó, hãy thay rm bằng cp và đích: -exec cp {} đích
Bố già

18

Tôi không biết về đường dẫn đầy đủ, nhưng bạn có thể sử dụng -Rcho đệ quy. Ngoài ra, nếu bạn không cố lsgắng, bạn có thể làm find *.


16

Không sử dụng các lệnh bên ngoài nào ngoài ls:

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


Tùy chọn không xác định '-1'. Phá thai.
ilw

15
du -a

Tiện dụng cho một số vỏ thiết bị giới hạn nơi không tìm thấy / định vị.


1
Bất cứ ý tưởng làm thế nào tôi có thể loại bỏ các kích thước tập tin awk?
Arnold Roa


10

Đừng làm nó phức tạp. Tôi chỉ sử dụng cái này và có một đầu ra đẹp:

ls -lR /path/I/need

3
OP chỉ muốn con đường đầy đủ và không có gì khác. ls -lRsẽ không đáp ứng mục tiêu đó.
tiền mã hóa

xin lỗi, nó không làm điều đó
Aryeh Beitz

9

Cách dễ nhất cho tất cả những người tương lai của bạn chỉ đơn giản là:

du

Tuy nhiên, điều này cũng cho thấy kích thước của những gì có trong mỗi thư mục Bạn có thể sử dụng awk để chỉ xuất ra tên thư mục:

du | awk '{print $2}'

Chỉnh sửa- Xin lỗi xin lỗi, xấu của tôi. Tôi nghĩ rằng đó chỉ là thư mục cần thiết. Tôi sẽ để nó ở đây trong trường hợp bất cứ ai trong tương lai cũng cần nó ...


Thật thú vị, vì nó cho tôi thấy những thứ tôi không biết tôi muốn biết - giống như Google gợi ý. Hóa ra, tôi muốn biết mỗi tập tin chiếm bao nhiêu dung lượng.
Jake Toronto

9

Với quyền tự do sử dụng tất cả các tùy chọn ls có thể:

find -type f | xargs ls -1


9

Tôi nghĩ cho một danh sách phẳng cách tốt nhất là:

find -D tree /fullpath/to-dir/ 

(hoặc để lưu nó trong tệp txt)

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

3
Đã thử trên Mac OS 10.13.3. find: illegal option -- D
Jayant Bhawal

8

Chạy lệnh bash với định dạng sau:

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

6

Đây là một câu trả lời một phần cho thấy tên thư mục.

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

Giải trình:

ls -mR * liệt kê các tên thư mục đầy đủ kết thúc bằng dấu ':', sau đó liệt kê riêng các tệp trong thư mục đó

sed -n 's/://p' tìm các dòng kết thúc bằng dấu hai chấm, loại bỏ dấu hai chấm và in dòng

Bằng cách lặp qua danh sách các thư mục, chúng ta sẽ có thể tìm thấy các thư mục là tốt. Vẫn đang làm việc trên đó. Đó là một thách thức để có được các ký tự đại diện thông qua xargs.


câu trả lời tuyệt vời .. chính xác những gì tôi cần!
Selvin

5

Thêm một ký tự đại diện vào cuối thư mục ls buộc các đường dẫn đầy đủ. Ngay bây giờ bạn có điều này:

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

Bạn có thể làm điều này thay vào đó:

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

Thật không may, điều này không in đường dẫn đầy đủ cho các thư mục được đệ quy, vì vậy nó có thể không phải là giải pháp đầy đủ mà bạn đang tìm kiếm.


Thật không may, bạn không thể sudo ls với ký tự đại diện (vì ký tự đại diện được mở rộng như người dùng bình thường).
rút lorien

4

Rất nhiều câu trả lời tôi thấy. Đây là của tôi và tôi nghĩ khá hữu ích nếu bạn đang làm việc trên Mac.

Tôi chắc rằng bạn biết có một số tệp "bó" ( .app , .rtfd , .workflow , v.v.). Và nhìn vào cửa sổ của Finder, chúng dường như là các tệp đơn. Nhưng họ thì không. Và $ lshoặc $ findxem chúng như các thư mục ... Vì vậy, trừ khi bạn cần liệt kê nội dung của chúng, điều này cũng hiệu quả với tôi:

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

Tất nhiên, điều này là dành cho thư mục hoạt động và bạn có thể thêm các tiện ích mở rộng của các gói khác (nhưng luôn luôn có /sau chúng). Hoặc bất kỳ tiện ích mở rộng nào khác nếu không có gói mà không có /.

Khá thú vị " .lpdf/" (pdf đa ngôn ngữ). Nó có .pdfphần mở rộng " " bình thường (!!) hoặc không có trong Finder. Bằng cách này, bạn nhận được (hoặc chỉ đếm 1 tệp) cho việc này pdfvà không phải là một loạt các công cụ


4

ls -lR là những gì bạn đang tìm kiếm, hoặc ít nhất tôi đã. chúc mừng


OP chỉ muốn con đường đầy đủ và không có gì khác. ls -lRsẽ không đáp ứng mục tiêu đó.
Hadrien Toma

3

Nếu thư mục được truyền dưới dạng đường dẫn tương đối và bạn sẽ cần chuyển đổi nó thành đường dẫn tuyệt đối trước khi gọi find. Trong ví dụ sau, thư mục được truyền làm tham số đầu tiên cho tập lệnh:

#!/bin/bash

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

Nếu hệ thống của bạn có readlinkbạn có thể làmdirectory=$(readlink -e $1)
Tạm dừng cho đến khi có thông báo mới.

Đúng, nhưng kết hợp cd / pwd sẽ hoạt động trên mọi hệ thống. readlinktrên OS X 10.5.8 không hỗ trợ tùy chọn -e.
John Keyes

3
tar cf - $PWD|tar tvf -             

Điều này chậm nhưng hoạt động đệ quy và in cả thư mục và tệp. Bạn có thể đặt nó với awk / grep nếu bạn chỉ muốn tên tệp mà không có tất cả các thông tin / thư mục khác:

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

2
bạn cũng có thể sử dụng một cách đơn giản: tar cvf / dev / null $ PWD
RuleB

2

@ ghostdog74: Ít chỉnh với giải pháp của bạn.
Mã sau có thể được sử dụng để tìm kiếm tập tin với đường dẫn tuyệt đối đầy đủ của nó.

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

Tôi biết tên tập tin nhưng cũng muốn thư mục.

tìm $ NKT | tên tệp fgrep

hoạt động hoàn hảo trong Mac OS 10.12.1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.