Lấy danh sách tên thư mục tìm


35

Tôi biết tôi có thể làm điều này để có được một danh sách các tên thư mục:

find . -type d -maxdepth 1 

Đầu ra trông như thế này:

.
./foo
./bar

Tôi thích danh sách mà không có ./. Có cách nào để tìm thấy đầu ra chỉ là tên thô?

Tôi đã thử gửi danh sách tới stat để định dạng nó nhưng điều đó chỉ mang lại cho tôi kết quả tương tự:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

Vì vậy, bạn muốn foo bar ...tất cả trên một dòng mà không có ./ở phía trước?
Levon

Đây có phải là hoàn toàn vì lý do thẩm mỹ / thẩm mỹ hoặc bạn đang cố gắng làm một cái gì đó với đầu ra?
jw013

Câu trả lời:


42

Với GNU, findbạn có thể sử dụng -printftùy chọn:

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

Như đã lưu ý bởi Paweł trong các bình luận, nếu bạn không muốn thư mục hiện tại được liệt kê thêm -mindepth 1, ví dụ:

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

Tôi không thể tìm thấy bất kỳ đề cập nào về -printftùy chọn trong thông số POSIX mới nhất và tôi tự hỏi nó có khả năng di động như thế nào ...
rahmu

@rahmu: Điều này đã được thử nghiệm với GNU find. Không có printftùy chọn nào được POSIX đề cập và dường như chúng không được hỗ trợ bởi một số findphiên bản khác . GNU find có thể được cài đặt ở hầu hết các nơi, vì vậy theo nghĩa đó, nó có thể mang theo được.
Thor

1
cũng thêm vào -mindepth 1nếu bạn muốn thoát khỏi.
Paweł Prażak

18

Cập nhật:

Một thay thế ngắn hơn:

 find . -maxdepth 1 -type d | cut -c 3-

Sẽ cung cấp cho bạn tên, mỗi tên một dòng, không có dấu gạch chéo


4
@downvoter .. một downvote mà không cần giải thích không giúp được ai (OP, SO hoặc tôi). Đây là một giải pháp chức năng cho câu hỏi của OP. Tôi rất vui lòng sửa lỗi nếu chỉ ra hoặc cải thiện câu trả lời, nhưng điều đó đòi hỏi phản hồi mang tính xây dựng thay vì chỉ là một "nhấp chuột" ẩn danh.
Levon

1
Tôi là người đã đánh giá thấp khi câu trả lời của bạn bao gồm phân tích cú pháp ls. Đồng thời tôi đã đăng một liên kết về lý do tại sao đây là một ý tưởng tồi trên một câu trả lời khác đã bị xóa kể từ đó. Lúc đó chỉ có 2 câu trả lời và lý do có vẻ hiển nhiên. Tôi rất vui vì bạn đã chỉ ra sự mơ hồ, và đây là lời giải thích của tôi. Đối với hồ sơ, tôi đã chuyển downvote của mình thành upvote vì tôi đồng ý với câu trả lời hiện tại của bạn.
rahmu

@rahmu Đưa ra một lời giải thích cho downvote của bạn trong một câu hỏi khác không hữu ích với tôi (và chỉ rõ ràng với bạn). Ngoài ra, mặc dù đây là một giải pháp tốt hơn, nhưng giải pháp tôi đã đăng trước đây chỉ hoạt động tốt (vâng, tôi quen thuộc với liên kết "không sử dụng ls" của bạn - nhưng nó không áp dụng một cách mù quáng trong mọi trường hợp). Nếu bạn có một ví dụ ngược lại về lý do tại sao giải pháp ban đầu của tôi sẽ không hiệu quả, tôi rất muốn biết nó (để tôi thực sự có thể học được điều gì đó từ việc này), nếu không bạn chỉ đăng một liên kết và không cung cấp bất cứ điều gì mang tính xây dựng.
Levon

Hãy xem xét có một \ntên trong thư mục mà bạn không thể sử dụng cắt để lấy nó (đó là những gì bạn đã làm khi tôi hạ cấp bạn). Có một vài trường hợp lskhông hành xử nguy hiểm và hầu như luôn an toàn hơn khi sử dụng cách khác.
rahmu

9

Sử dụng GNU find, bạn có thể sử dụng -mindepth để ngăn tìm kết quả khớp với thư mục hiện tại:

find . -type d -maxdepth 1 -mindepth 1

Vì bạn không làm điều này một cách đệ quy, bạn có thể sử dụng bash global:

echo */

Thêm một dấu / vào một quả địa cầu sẽ khiến chỉ các thư mục được khớp.


1
*/bỏ lỡ các tập tin dấu chấm và bao gồm các liên kết tượng trưng. Điều này có thể hoặc không thể là một vấn đề.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - Nó sẽ luôn bỏ lỡ các liên kết tượng trưng, ​​nhưng dotfiles phụ thuộc vào việc dotglob có được đặt hay không.
jordanm

6

Hãy sedloại bỏ hai ký tự đó:

find . -maxdepth 1 -type d | sed -e 's/^\.\///'


2

Tôi thường sử dụng:

find * -type d

Nhưng tôi không biết liệu đó có phải là cách đúng đắn để làm những gì bạn muốn.


1
Nếu bạn định để shell mở rộng tất cả tên tệp, tại sao lại sử dụng find?
jordanm

@jordanm Để chỉ chọn thư mục. echo */sẽ làm điều tương tự, ít nhiều (nó bỏ lỡ các tệp chấm và bao gồm các liên kết tượng trưng), nhưng sau đó joachim sẽ hỏi làm thế nào để loại bỏ cuối cùng /.
Gilles 'SO- ngừng trở nên xấu xa'

0

Trong AIX, tham số 'maxdepth' không hoạt động.

Nói chung, điều này làm việc cho tôi:

find ./ -type d | cut -d"/" -f2 | sort -u


0

Những gì bạn đang tìm kiếm được gọi basename, nó bỏ qua cấu trúc thư mục unix

Ví dụ dưới đây:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

nó sẽ loại trừ đầu ra ngay cả đường dẫn dir, loại bỏ sự cần thiết cd trước khi chạy lệnh


Một số thông tin quảng cáo:

Tôi chuyển qua -execlàm đối số để tìm thay thế |(ống) một lệnh khác cho đầu ra (tránh lệnh thứ hai đi qua từng dòng đầu ra, vì đã nói rằng, tùy thuộc vào đầu ra, nó có thể cải thiện hiệu suất cho tập lệnh)

LƯU Ý: findcác tùy chọn không phảivị trí (-maxdepth ảnh hưởng đến các thử nghiệm được chỉ định trước nó cũng như các tùy chọn được chỉ định sau 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.