Làm thế nào tôi có thể hướng một đầu vào đường ống đến lệnh ls?


20

Khi tôi gõ một cái gì đó như:

find . -name *foo* | ls -lah

nó trả về kết quả giống như một lslệnh đơn giản , như thể nó không có đầu vào.

Tuy nhiên:

ls -lah $( find . -name *foo* )

hoạt động tốt, nhưng chỉ khi findlệnh có kết quả.

Có thể ống để ls?


Bạn cần xác định xem bạn muốn ls các tệp bên trong mỗi kết quả tìm kiếm hay bạn muốn trực tiếp tìm kết quả. Nếu đó là câu trả lời sau, thì câu trả lời của u / Dennis là câu trả lời đúng.
rmutalik

Câu trả lời:


27

Bạn có thể sử dụng -execvới findlệnh.

find . -name '*foo*' -exec ls -lah {} \;

Cảm ơn bạn cho giải pháp của bạn. Không có đường ống nhưng đó là một phương pháp thanh lịch. Nếu không tìm thấy bất kỳ kết quả nào với 'find', nó sẽ không hiển thị bất cứ điều gì (thực tế là tốt).
Lasall

7
Một cách tốt hơn một chút:find . -name '*foo*' -exec ls -lah {} +
jlliagre

20
find . -name *foo* | xargs -r ls -lah

Cần làm việc.


1
Cảm ơn bạn cho giải pháp đó. Nhưng làm thế nào tôi có thể đối phó với khoảng trắng?
Lasall

2
@ Đặt cách ưa thích là sử dụng find -exec +(hoặc -exec \;). xargsChỉ an toàn khi sử dụng với -0tùy chọn, điều đó có nghĩa là bạn phải nói bất kỳ lệnh nào bạn sử dụng xargsđể phân định các mục bằng NULL-byte (\ 0). Với findbạn có thể làm điều đó với -print0. xargs -0 và find -print0 không phải là tiêu chuẩn, nhưng -exec là vậy, vì vậy nếu tính di động là một vấn đề, hãy sử dụng find với -exec.
geirha


3

Sử dụng cái này: (ls có thể sắp xếp, hoạt động với tên tệp có dấu cách hoặc ký tự bất thường)

find . -name *foo* -print0 | xargs -0 ls -lah

"-print0" có nghĩa là các tên tệp như file foo 1sẽ nhận được đầu ra từ findsau bởi null. Đối số "-0" cho xargs bảo nó mong đợi loại đầu vào này, vì vậy tên tệp có khoảng trắng được dẫn đúng vào lslệnh.

Việc xargsxây dựng theo một số cách tốt hơn là find etc -exec ls {} \;vì tất cả các tên tệp được gửi đến lscùng một lúc, vì vậy nếu bạn muốn sắp xếp tất cả chúng theo dấu thời gian (sử dụng ls), một cái gì đó như thế này hoạt động:

find . -iname *pdf -print0 | xargs -0 ls -ltr

Trên hệ thống NetBSD, "-printx" cũng là một tùy chọn (đây có vẻ là một đối số hữu ích với tôi, nhưng dù sao đi nữa, chúng tôi có xargs -0 và không sao):

find . -name *foo* -printx | xargs ls -lah (không dành cho Ubuntu)


Điều này đã giúp tôi có thể thực sự sử dụng các chức năng sắp xếp của ls, cho những người cố gắng làm điều này.
Harry Mustoe-Playfair
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.