find . -type d
có thể được sử dụng để tìm tất cả các thư mục dưới một số điểm bắt đầu. Nhưng nó cũng trả về thư mục hiện tại ( .
), có thể không mong muốn. Làm thế nào nó có thể được loại trừ?
find . -type d
có thể được sử dụng để tìm tất cả các thư mục dưới một số điểm bắt đầu. Nhưng nó cũng trả về thư mục hiện tại ( .
), có thể không mong muốn. Làm thế nào nó có thể được loại trừ?
Câu trả lời:
find . ! -path . -type d
Đối với trường hợp cụ thể này ( .
), golf tốt hơn mindepth
giải pháp (24 so với 26 ký tự), mặc dù điều này có lẽ hơi khó để gõ vì !
.
Để loại trừ các thư mục khác, điều này sẽ chơi golf kém hơn và yêu cầu một biến cho DRYness:
D="long_name"
find "$D" ! -path "$D" -type d
Cây quyết định của tôi giữa !
và -mindepth
:
!
cho tính di động..
? Ném một đồng xu.long_name
? Sử dụng -mindepth
.find / ! -regex '/\(a\|b\)/.*'
hoặc đơn giản hơn, chuyển qua grep. Để không tái diễn, những điều trên sẽ rất không hiệu quả và bạn nên sử dụng -prune
: stackoverflow.com/questions/1361277/iêu
find
với grep
để loại trừ thư mục nhưng thư mục mẹ vẫn ở đó, khiến mọi thứ vẫn bị xóa.
find
, bạn cần kiểm tra các tiền tố: stackoverflow.com/questions/17959317/ Nhưng Nhưng một vòng lặp Bash có thể xử lý nó :-)
\!
) để ở bên an toàn. Tất cả các ví dụ trong máy của tôi man find
đã thoát được, nên có vẻ như đó là một ý tưởng tốt ™. Chỉnh sửa - Chỉ cần chú ý rằng nó thậm chí còn nói rõ ràng:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Không chỉ độ sâu đệ quy find
có thể được điều khiển bởi -maxdepth
tham số, độ sâu cũng có thể được giới hạn từ đỉnh đầu ra trên sử dụng -mindepth
tham số tương ứng . Vì vậy, những gì một người thực sự cần là:
find . -mindepth 1 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
Tôi sử dụng find ./* <...>
khi tôi không quan tâm đến việc bỏ qua các dotfiles cấp đầu tiên (*
thế giới không khớp với các mặc định này trong bash - xem tùy chọn 'dotglob' trong shopt dựng sẵn: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).
nhật thực tmp # tìm. . ./màn ./screen/.testfile2 ./.X11-unix ./.ICE -unix ./tmux-0 ./tmux-0/default
nhật thực tmp # tìm ./* ./màn ./screen/.testfile2 ./tmux-0 ./tmux-0/default
-exec
tùy chọn. Ví dụ, nếu bạn thử find dir/* -type d -exec rmdir {} \;
, bạn sẽ thấy lỗi.
rmdir
và rất có thể cho bạn biết rằng các thư mục không trống vì find
sẽ thực hiện tìm kiếm sâu trước vào các thư mục, hiển thị cho cha mẹ trước con cái họ.
Chà, một cách giải quyết đơn giản nữa (giải pháp không hiệu quả với tôi trên windows git bash)
find * -type d
Nó có thể không thực hiện nhiều, nhưng hoàn thành công việc, và đó là những gì chúng ta cần đôi khi.
[Chỉnh sửa]: Như @AlexanderMills nhận xét, nó sẽ không hiển thị các thư mục ẩn trong vị trí gốc (ví dụ ./.hidden
), nhưng nó sẽ hiển thị các thư mục con ẩn (ví dụ ./folder/.hiddenSub
:). [Đã thử nghiệm với git bash trên windows]
find /path/ ! -path "/path/first" ! -path "/path/second"
theo cách này?