tìm mà không cần đệ quy


246

Có thể sử dụng findlệnh theo một cách nào đó mà nó sẽ không lặp lại vào các thư mục con? Ví dụ,

DirsRoot
  |-->SubDir1
  |    |-OtherFile1
  |-->SubDir2
  |    |-OtherFile2
  |-File1
  |-File2

Và kết quả của một cái gì đó như thế nào find DirsRoot --donotrecuourse -type fsẽ là duy nhất File1, File2?

Câu trả lời:


380

Tôi nghĩ bạn sẽ có được những gì bạn muốn với -maxdepth 1tùy chọn, dựa trên cấu trúc lệnh hiện tại của bạn. Nếu không, bạn có thể thử nhìn vào trang người đàn ông chofind .

Mục có liên quan (để thuận tiện):

-maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc-
          tories below the command line arguments.   `-maxdepth  0'  means
          only  apply the tests and actions to the command line arguments.

Các tùy chọn của bạn về cơ bản là:

find DirsRoot/* -maxdepth 0 -type f #This does not show hidden files

Hoặc là:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files

Đối với ví dụ của OP tôi nghĩ điều này cần phải có -maxdepth 1?
Paul R

@Paul R: Thật ra, kiểu đó phụ thuộc vào cách anh ấy muốn xử lý các tập tin ẩn, nhưng dù sao tôi cũng đã sửa đổi câu trả lời của mình. Ví dụ của anh ấy 1có lẽ là những gì anh ấy muốn.
eldarerathis

1
Đối với tôi, -maxdepth 0không hiển thị bất kỳ tệp nào nhưng -maxdepth 1đang hoạt động như dự định, với các tệp ẩn cũng được hiển thị.
Bruce Wayne

1
@BruceWayne lưu ý *trong find DirsRoot/* -maxdepth 0 -type f. Nếu bạn để nó ra, nó sẽ không hiển thị bất kỳ tập tin.
đồ

@mook, Cảm ơn, nhưng tôi không thể nhớ bối cảnh ban đầu mà tôi gặp phải vấn đề này, haha.
Bruce Wayne

33

Tôi tin rằng bạn đang tìm kiếm -maxdepth 1.


1
Đối với ví dụ của OP tôi nghĩ điều này cần phải có -maxdepth 1?
Paul R

Có, nếu anh ta đang sử dụng lệnh chính xác như trong ví dụ của mình thì đó sẽ là 1. Sai lầm của tôi.
Nghịch lý bánh quế

17

Nếu bạn tìm giải pháp tuân thủ POSIX:

cd DirsRoot && find . -type f -print -o -name . -o -prune

-maxdepth không phải là tùy chọn tuân thủ POSIX.


cảm ơn vì giải pháp này, nhưng điều này không thể được đơn giản hóa find DirsRoot/* -type f -prune?
dokaspar

@dokaspar Câu hỏi thực sự tuyệt vời! (bạn đã quên chèn "-o" trước -prunebtw) Câu trả lời là không, không thể. Để hiểu đầy đủ TẠI SAO nó không thể được đơn giản hóa, chỉ cần phát set -xlệnh trước khi phát ra find DirsRoot/* -type f -o -prunevà bạn sẽ thấy ngay lập tức. Nguyên nhân gốc rễ là những hạn chế của việc mở rộng DirsRoot/*biểu thức.
sqr163

không làm việc trên centos, vẫn làm đệ quy đầy đủ ở đầu ra !!!! Lệnh thích hợp làfind . -name . -o -prune
Reishin

trên Solaris, dù sao đi nữa, với DirsRoot là đường dẫn mong muốn, bạn không cần cd; thay vào đó, bạn có thể: tìm DirsRoot /. -type f -print -o -name. -o -prune
kẻ gây rối
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.