liệt kê các tệp trong một thư mục mà không liệt kê các thư mục con và nội dung của chúng trong thư mục đó


24

Tôi muốn tạo một danh sách tất cả các tệp trong một thư mục, mà không liệt kê bất kỳ thư mục con nào nằm trong cùng thư mục đó và in danh sách đó sang một tệp mới.

ls -d * > filelist

sẽ tạo một danh sách tất cả các tệp trong thư mục hiện tại, nhưng nó cũng liệt kê các thư mục con trong thư mục hiện tại. Tôi đã thử findlệnh bằng cách sử dụng -maxdepth 1tùy chọn - tuy nhiên, định dạng đầu ra là một vấn đề vì find cũng in ra đường dẫn cùng với tên tệp.

Nếu bất cứ ai có thể vui lòng cho tôi biết có lẽ một lệnh hoặc tùy chọn khác để sử dụng sẽ tạo ra một danh sách đầu ra chỉ các tệp trong một thư mục chứ không phải tên của các thư mục con hoặc nội dung của chúng, tôi sẽ đánh giá cao nó.


2
Tôi bối rối ls -d *chỉ liệt kê các tệp và thư mục trong thư mục hiện tại không bao gồm các tệp / thư mục ẩn ở đây;
GM-Script-Writer-62850

có, nhưng tôi không muốn các thư mục trong thư mục đó được liệt kê, chỉ muốn các tệp trong thư mục đó được liệt kê
janet

Câu trả lời:


22

Giải pháp dựa trên tìm kiếm:

find . -maxdepth 1 -type f -printf '%f\n'

Giải pháp dựa trên Bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

Giải pháp dựa trên bash sẽ giúp bạn có được mọi thứ không phải là thư mục; nó sẽ bao gồm những thứ như ống được đặt tên (bạn có thể muốn điều này). Nếu bạn đặc biệt chỉ muốn các tệp , hãy sử dụng findlệnh hoặc một trong các cách sau:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Nếu bạn sẽ sử dụng nó thường xuyên, tất nhiên bạn có thể đặt nó vào bí danh ở đâu đó trong ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Vì bạn đã lưu ý trong các nhận xét rằng bạn thực sự sử dụng OSX chứ không phải Ubuntu, tôi sẽ đề nghị rằng lần tới bạn trực tiếp đặt câu hỏi cho Apple hoặc các trang web Stack & Unix Stack Linux chung hơn .


1
Đảm bảo kiểm tra xem các giải pháp này có đúng với bạn hay không dựa trên việc bạn có muốn bao gồm các tệp ẩn hay không.
Kevin Wheeler

10

Chỉ liệt kê tên tệp:

1. ls -p | grep -v / (không có tệp ẩn)
 2. ls -l | g ^ ^ - | tr -s '' | cut -d '' -f 9 (không có tệp ẩn)

 a) ls -pa | grep -v / (với các tệp ẩn)
 b) ls -la | g ^ ^ - | tr -s '' | cut -d '' -f (với các tệp ẩn)

Chỉ liệt kê các thư mục:

1. ls -p | grep / (không ẩn)
 2. ls -l | g ^ ^ | tr -s '' | cắt -d '' -f 9 (không ẩn)

 a) ls -pa | grep / (có ẩn)
 b) ls -l | g ^ ^ | tr -s '' | cắt -d '' -f 9 (có ẩn)

grep -v -e ^ $ là xóa các dòng trống khỏi kết quả.

Thêm chi tiết :
cờ ls -p là đặt '/' ở cuối tên thư mục, cờ -R dành cho tìm kiếm đệ quy, -l để liệt kê với thông tin, -a để liệt kê tất cả (bao gồm các tệp ẩn) với thông tin, grep Cờ -v dành cho kết quả invertion và cờ -e để khớp regex.


7

Để chỉ liệt kê các tệp thông thường:

ls -al | grep ^-

Với các liên kết tượng trưng bao gồm:

ls -al | grep ^[-l]

Trong đó ký tự đầu tiên của danh sách mô tả loại tệp, -có nghĩa là đó là tệp thông thường, cho liên kết tượng trưng là l.

Debian / Ubuntu

In tên của tất cả các tệp phù hợp (bao gồm các liên kết):

run-parts --list --regex . .

Với đường dẫn tuyệt đối:

run-parts --list --regex . $PWD

In tên của tất cả các tệp trong /etcđó bắt đầu bằng pvà kết thúc bằng d:

run-parts --list --regex '^p.*d$' /etc

5

Một giải pháp khác, một giải pháp ngắn ngây thơ làm việc cho tôi:

ls -la | grep -E '^[^d]' > files

hoàn hảo cho tôi,ls -alR |grep -E '^-'
ở đây

4

Tôi sẽ đề nghị sử dụng find và chỉ xóa tên thư mục khỏi đầu ra nếu cần:

find . -type f -maxdepth 1 | sed s,^./,,

2
-maxdepth 1nên đến trước khi bất kỳ bộ lọc, và bạn có thể đạt được kết quả này mà không sử dụng sedvới các -printftùy chọn, ví dụ: find . -maxdepth 1 -type f -printf '%f\n'(điều này sẽ hiệu quả hơn so với sử dụng một chương trình phụ).
evilsoup

3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Một lựa chọn khả thi khác là

ls -F | grep -v '/' | sed /[@*]$// > filelist

Việc --file-typeđặt a / ở cuối các thư mục (nhưng cũng là @ ở cuối các liên kết tượng trưng. The grep -v '/'Xóa các thư mục con (vì giờ đây chúng kết thúc bằng '/'). Loại sed s/@$//bỏ @. để grep -v hoạt động chính xác.


cảm ơn bạn đã phản hồi thật không may, nó không làm việc cho tôi, có lẽ tôi đang thực hiện nó không chính xác. nếu tôi sử dụng lệnh chính xác mà bạn đã đưa cho tôi, tôi gặp phải lỗi sau: ls: tùy chọn bất hợp pháp - - cách sử dụng: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [tệp ...] tôi đã thử sử dụng ký tự * ký tự đại diện thay cho kết hợp với --file-type. nếu bạn có thể làm rõ tôi sẽ đánh giá cao nó!
janet

Lệnh này hoạt động với tôi (chạy 13.04), bạn đang sử dụng phiên bản nào của Ubuntu?; -1không quan trọng với grep bạn không cần nó; nếu bạn muốn bao gồm các tệp ẩn, hãy sử dụng -atùy chọn trênls
GM-Script-Writer-62850

Trên thực tế, tôi đang làm việc trên máy mac. có lẽ lệnh hơi khác nhau trên mac os x hoặc unix?
janet

1
Bạn cũng có thể thửls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower
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.