Làm cách nào để loại trừ các thư mục khi liệt kê các tập tin?


21

Làm cách nào để loại trừ các thư mục khi liệt kê các tệp trong thư mục hiện tại?

ls .

^ sẽ bao gồm các thư mục trong danh sách.

Câu trả lời:


23

Hãy thử cái này:

find . -maxdepth 1 -not -type d

3
giữ cho nó đơn giản: $ find. -type f
kẹt

9
Không. (1) nó sẽ được đệ quy, (2) nó sẽ không liệt kê các liên kết tượng trưng. @Steve yêu cầu tương đương với ls .không có thư mục - và đây là.
Alexander Gladysh

2
Thêm -lshoặc -exec ls -l {} \;sẽ làm cho nó như ls -lkhông có thư mục.
Ladadadada

15

Để có được nó chính xác tương đương với ls .bạn cần không hiển thị các thư mục ẩn.

find . -maxdepth 1 -not -type d -and -not -name '.*'

và điều đó vẫn để lại cho bạn './' tiền tố cho mỗi tên tệp. Đó không thực sự là một vấn đề, nhưng tôi nghĩ nó hơi xấu. Tôi đã đi với:

ls -p | grep -v '/$'

Và điều đó sẽ giúp bạn có một danh sách trông giống nhau và bạn cũng có thể thêm các lsđối số bổ sung . Thêm một --color=alwaysvà bạn sẽ lấy lại màu của bạn hoặc -ađể xem các tập tin ẩn.

Tôi thích câu trả lời của Alexandre bởi vì anh ấy thực sự phụ thuộc vào một đặc điểm hệ thống tập tin của tập tin được đề cập để nó sẽ không bị lừa bao giờ. Câu trả lời của tôi sẽ bị đánh lừa bởi một tệp có '/' là ký tự cuối cùng trong tên của nó. Nhưng có vẻ như đó là vấn đề.


1
'-not' là GNU find có liên quan, vì nó không tuân thủ POSIX, tốt hơn hết là không dạy các tùy chọn này vì người dùng có thể có
thói quen

2
@JiriXichtkniha thay thế POSIX cho -not là gì?
Lucas Gallindo

5

thử đi:

$ tìm. -type f -maxdepth 1

hoặc này:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d


3

Mặc dù đó là một bài viết cũ, nhưng tôi nghĩ rằng điều này có thể giúp ..

$ ls -l | grep -v ^ d

Nó sẽ liệt kê tất cả các tệp bao gồm các liên kết tượng trưng, ​​ký tự và khối tệp.


Câu trả lời này đã được cung cấp hơn một năm trước khi bị kẹt, (làm cho tiếng ồn thị giác này.)
Alexx Roche

2

Các giải pháp "tìm" ở trên làm mất một số khả năng của ls - ví dụ: chỉ liệt kê các tệp, được sắp xếp theo thời gian sửa đổi giảm dần.

Các câu trả lời "ls -p | grep" không xử lý một cách tao nhã với các yếu tố khác của ls như -R nếu chúng được mong muốn

Câu trả lời sau đây, verbose trong khi hơn, theo ý kiến của tôi phản ánh chân thật nhất ls hành vi và linh hoạt nhất để lựa chọn "file duy nhất"

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Chỉ cần thay thế các công tắc ls như mong muốn và kết quả sẽ chỉ được trả về với các tệp. Nếu các liên kết và các mục khác cũng được yêu cầu thì việc làm lại nhỏ sẽ cần phải được thực hiện để kiểm tra để đưa vào.


0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Với điều này, bạn vẫn có thể sử dụng bất kỳ tùy chọn khác lsthường mất. Hoặc ... xóa -vđể chỉ liệt kê các thư mục. Hoặc ... thay thế thư mục bằng bất kỳ loại tệp nào filehiểu và báo cáo, như ASCII, trống, ELF, v.v.


Điều này không hoạt động nếu bất kỳ tên tệp nào được liệt kê có chứa khoảng trắng.
Phi hành gia

ls -t .|while read f;do [ -f "$f" ]&& echo $f;donenhanh hơn khoảng 3 lần trong các thử nghiệm của tôi
Alexx Roche

0

Tôi đã ở trên một hệ thống mà findnhị phân không hỗ trợ -notvà cuối cùng tôi đã sử dụng:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Ưu điểm: Không phụ thuộc vào bất cứ điều gì khác ngoài sh ls echo
Tương thích với bash và dash
Có thể thay đổi để khớp với những thứ khác, (chẳng hạn như thư mục) bằng cách thay đổi -f
Nhanh nhất so với một số câu trả lời và sử dụng ít RAM và CPU hơn

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.