Cách loại trừ thư mục / current / dot này khỏi find kiểu D


186
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:


193

Giải pháp POSIX 7 :

find . ! -path . -type d

Đối với trường hợp cụ thể này ( .), golf tốt hơn mindepthgiả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 !-mindepth:

  • kịch bản? Sử dụng !cho tính di động.
  • phiên tương tác trên GNU?
    • loại trừ .? Ném một đồng xu.
    • loại trừ long_name? Sử dụng -mindepth.

Nếu bạn cần loại trừ nhiều đường dẫn chỉ cần làm find /path/ ! -path "/path/first" ! -path "/path/second"theo cách này?
Vincent De Smet

2
@VincentDeSmet bạn có muốn loại trừ chỉ những đường dẫn đó, hoặc thực sự không tái diễn vào chúng? Nếu chỉ là các đường dẫn, bạn có thể sử dụng 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
Ciro Santilli 郝海东 冠状 病 事件

vấn đề của tôi là như sau: Tôi muốn xóa đệ quy mọi thứ trong một thư mục ngoại trừ 1 thư mục con. Tôi đã sử dụng findvớ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.
Vincent De Smet

@VincentDeSmet Tôi không thấy giải pháp trực tiếp với 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ó :-)
Ciro Santilli 冠状 病 六四法轮功

Bạn có thể muốn thoát khỏi dấu chấm than char ( \!) để ở 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.
Adrian Günter

199

Không chỉ độ sâu đệ quy findcó thể được điều khiển bởi -maxdepththam số, độ sâu cũng có thể được giới hạn từ đỉnh đầu ra trên sử dụng -mindepththam 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

5
hoạt động trên GNU find, nhưng không may là một phần mở rộng gnu cho POSIX 7 và thậm chí LSB sử dụng các tiện ích shell POSIX (không phải các tiện ích mở rộng GNU)
Ciro Santilli 冠状 病 六四 事件 法轮功

6
Điều này làm việc cho tôi. Cụ thể:find . -mindepth 1 -maxdepth 1 -type d ...
racl101

19

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

FYI. không sử dụng thủ thuật này với -exectùy chọn. Ví dụ, nếu bạn thử find dir/* -type d -exec rmdir {} \;, bạn sẽ thấy lỗi.
plhn

Bạn đang nhầm lẫn, hoặc có lẽ bị đánh giá sai. Lệnh đó sẽ hoạt động tốt. Nếu bạn đang gặp lỗi, chúng sẽ đến từ rmdirvà rất có thể cho bạn biết rằng các thư mục không trống vì findsẽ 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ọ.
Milos Ivanovic

2
Lưu ý: "bỏ qua các dotfiles cấp đầu tiên" cũng có nghĩa là loại trừ tất cả các tệp / thư mục ẩn.
Jonathan H

2

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]

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.