Làm cách nào tôi có thể liệt kê tất cả các tệp của một thư mục nhưng không liệt kê các thư mục hoặc tệp con của chúng. Nói cách khác: Làm cách nào để chỉ liệt kê các tệp?
Làm cách nào tôi có thể liệt kê tất cả các tệp của một thư mục nhưng không liệt kê các thư mục hoặc tệp con của chúng. Nói cách khác: Làm cách nào để chỉ liệt kê các tệp?
Câu trả lời:
Sử dụng find:
find . -maxdepth 1 -type f
Sử dụng -maxdepth 1tùy chọn đảm bảo rằng bạn chỉ tìm trong thư mục hiện tại (hoặc, nếu bạn thay thế .bằng một số đường dẫn, thư mục đó). Nếu bạn muốn có một danh sách đệ quy đầy đủ của tất cả các tệp trong đó và các thư mục con, chỉ cần loại bỏ tùy chọn đó.
findtrên mac, không có -type, cũng không có -maxdepthtùy chọn.
-typevà -maxdepthkhông phải là tùy chọn theo nghĩa thông thường; BSD find(như được sử dụng trên OS X) gọi họ là bầu cử sơ bộ , và họ phải đến sau tên tập tin toán hạng (s) ( .trong trường hợp này; lưu ý rằng, không giống như trên Linux, nhu cầu phiên bản BSD ít nhất một rõ ràng filename toán hạng); lệnh trong câu trả lời này chắc chắn hoạt động trên máy Mac.
find *.png -maxdepth 0 -type fđể tránh ./tiền tố trong tên tập tin đầu ra; cũng lưu ý -maxdepthcủa 0, không 1), miễn là tất cả bạn cần là file tên trong thứ tự chữ cái . Nếu bạn muốn những gì lscó thể làm cho bạn (định dạng / thứ tự đầu ra khác nhau, kiểm soát nội tuyến đối với việc các mục ẩn có được đưa vào hay không), bổ sung với tính năng lọc loại [đa], tập lệnh từ câu trả lời của tôi có thể giúp ích.
find * -maxdepth 0 -type f(một giải pháp thay thế bắt nguồn từ nhận xét của @ AlexHall) với find . -maxdepth 1 -type ftừ câu trả lời: find . ...luôn bao gồm các mục ẩn, tiền tố luôn luôn xuất ra tên tệp ./và, với GNU find(Linux), thường xuất ra danh sách không được sắp xếp. find * ..., do cho phép shell thực hiện việc lấp đầy phía trước, theo mặc định sẽ loại trừ các mục ẩn (có thể được thay đổi bằng shopt -s dotglob), chỉ xuất ra các tên tệp (không có tiền tố), được sắp xếp theo thứ tự bảng chữ cái. Cả hai cách tiếp cận đều không bao gồm các liên kết tượng trưng cho các tệp; sử dụng tùy chọn -Lđể làm như vậy.
ls -p | grep -v /
ls -p cho phép bạn hiển thị / sau tên thư mục, đóng vai trò như một thẻ để bạn xóa.
lsthêm vào find, vì cái sau trả về các đường dẫn tương đối và tên tệp duy nhất trước đây. Sử dụng các công cụ thích hợp cho công việc.
findCâu trả lời dựa trên carlpett ( find . -maxdepth 1 -type f) hoạt động về nguyên tắc, nhưng không hoàn toàn giống với cách sử dụng ls: bạn nhận được một danh sách có khả năng không được sắp xếp gồm các tên tệp đều có tiền tố./ và bạn mất khả năng áp dụng lsnhiều tùy chọn ;
cũng find luôn luôn tìm thấy các mục ẩn , trong khi lshành vi của phụ thuộc vào sự hiện diện hoặc vắng mặt của -ahoặc -Acác tùy chọn.
Một cải tiến , được đề xuất bởi Alex Hall trong một bình luận về câu hỏi là kết hợp vỏ cầu vồng vớifind :
find * -maxdepth 0 -type f # find -L * ... includes symlinks to files
lsnhiều tùy chọn sắp xếp / định dạng đầu ra khác.Câu trả lời ls+grep của Hans Roggeman khá thực dụng, nhưng khiến bạn không thích sử dụng -lđịnh dạng đầu ra dài ( ) .
Để giải quyết những hạn chế này, tôi đã viết tiện ích fls( f iltering ls ) ,
ls đồng thời cung cấp khả năng lọc kiểu ,fcho tệp, dcho thư mục và lcho các liên kết tượng trưng trước danh sách các lsđối số (chạy fls --helphoặc fls --manđể tìm hiểu thêm).Ví dụ:
fls f # list all files in current dir.
fls d -tA ~ # list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)
Nền tảng được hỗ trợ
Lưu ý: Ngay cả khi bạn không sử dụng Node.js, trình quản lý gói của nó npm, hoạt động trên các nền tảng và dễ cài đặt; thử
curl -L https://git.io/n-install | bash
Với Node.js được cài đặt, hãy cài đặt như sau:
[sudo] npm install fls -g
Ghi chú :
Bạn có cần sudohay không tùy thuộc vào cách bạn cài đặt Node.js / io.js và liệu bạn có thay đổi quyền sau đó hay không ; nếu bạn gặp EACCESlỗi, hãy thử lại với sudo.
Các -gđảm bảo toàn cầu cài đặt và là cần thiết để đặt flstrong hệ thống của bạn $PATH.
-1(số một); lsthực sự mặc định cho đầu ra "trống", tức là chỉ có tên tệp, nhưng khi xuất ra thiết bị đầu cuối sử dụng bố cục dựa trên cột (nhiều tên tệp trên mỗi dòng). Để nhận một tên tệp cho mỗi dòng đầu ra (đó là những gì dir /bsẽ xảy ra, nếu bộ nhớ phục vụ), hãy sử dụng -1tùy chọn này, thực sự được ngầm định khi stdout không được kết nối với thiết bị đầu cuối, chẳng hạn như khi gửi đến một đường ống hoặc tệp đầu ra.
Tôi thích sử dụng lscác tùy chọn, ví dụ:
-lsử dụng một định dạng danh sách dài-tsắp xếp theo thời gian sửa đổi, mới nhất trước-rđảo ngược thứ tự trong khi sắp xếp-F,--classifynối chỉ báo (một trong số * / => @ |) vào các mục nhập-h,--human-readablevới -l và -s, các kích thước in như 1K 234M 2G, v.v.
Đôi khi --colorvà tất cả những người khác. (Xem ls --help)
Điều này sẽ hiển thị các tệp, liên kết tượng trưng, thiết bị, đường dẫn, ổ cắm, v.v.
vì thế
find /some/path -maxdepth 1 ! -type d
có thể được sắp xếp theo ngày một cách dễ dàng:
find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +
hoặc là
find /some/path -maxdepth 1 -type f
sắp xếp theo kích thước:
find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +
Để không hiển thị các mục bị ẩn, trong đó tên bắt đầu bằng dấu chấm, bạn có thể thêm ! -name '.*':
find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +
Sau đó
Bạn có thể thay thế /some/pathbằng .để liệt kê cho thư mục hiện tại hoặc ..cho thư mục mẹ .
Bạn cũng có thể sử dụng lsvới grephoặc egrepvà đặt nó trong hồ sơ của mình làm bí danh:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
tìm tệp: ls -l / home | grep "^ -" | tr -s '' | cut -d '' -f 9
tìm thư mục: ls -l / home | grep "^ d" | tr -s '' | cut -d '' -f 9
tìm liên kết: ls -l / home | grep "^ l" | tr -s '' | cut -d '' -f 9
tr -s '' biến đầu ra thành tệp được phân cách bằng dấu cách, lệnh cut cho biết dấu phân cách là dấu cách và trả về trường thứ 9 (luôn là tên tệp / tên thư mục / tên liên kết).
Tôi sử dụng tất cả các thời gian!
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
được thêm vào xargsđể làm cho nó hoạt động và được sử dụng -1thay vì -lchỉ hiển thị tên tệp mà không có lsthông tin bổ sung
find -printf0 '...' | sort -z
Chỉ thêm vào câu trả lời của carlpett. Để có một cái nhìn hữu ích về các tệp, bạn có thể chuyển đầu ra thành ls.
find . -maxdepth 1 -type f|ls -lt|less
Hiển thị các tệp được sửa đổi gần đây nhất ở định dạng danh sách, khá hữu ích khi bạn đã tải xuống nhiều tệp và muốn xem phiên bản không lộn xộn của những tệp gần đây.
lskhông đọc đầu vào tiêu chuẩn, vì vậy sẽ vô ích khi chuyển bất kỳ thứ gì đến ls. Bạn đã bỏ lỡ xargs?
findlệnh trong câu trả lời này hoàn toàn bị bỏ qua ; lệnh tổng thể giống như ls -lt | less, không thực hiện lọc kiểu.
findbạn có thể làm được find . -maxdepth 1 -type f -ls. Nó dường như cũng hoạt động trên Mac OS, mặc dù tôi tin rằng -maxdepthvà -lskhông phải là tùy chọn di động thích hợp.
"find '-maxdepth'" không hoạt động với phiên bản bash cũ của tôi, do đó tôi sử dụng:
cho f trong $ (ls); làm nếu [-f $ f]; sau đó echo $ f; fi; làm xong
for f in $(ls)là sai gấp đôi. Bạn có thể khắc phục điều đó bằng for f in *nhưng sau đó nó sẽ bị hỏng vì bạn không trích dẫn đối số echomột cách chính xác.