2010-10-13 33 views
164

Có thể sử dụng lệnh find theo cách nào đó mà nó sẽ không tái phạm vào các thư mục con không? Ví dụ,tìm mà không cần đệ quy

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

Và kết quả của một cái gì đó giống như find DirsRoot --donotrecuourse -type f sẽ chỉ File1, File2?

Trả lời

243

Tôi nghĩ bạn sẽ nhận được những gì bạn muốn với tùy chọn -maxdepth 1, 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ử xem man page cho find.

entry có liên quan (đối với mục đích thuận tiện của):

-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. 

lựa 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:

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

Đối với ví dụ của OP, tôi nghĩ rằng điều này cần phải là '-maxdepth 1'? –

+0

@Paul R: Thực ra, loại phụ thuộc vào cách anh ta muốn xử lý các tệp ẩn, nhưng tôi vẫn đã sửa đổi câu trả lời của mình. Đối với ví dụ của mình '1' có lẽ là những gì anh ta muốn. – eldarerathis

+0

Đối với tôi, '-maxdepth 0' khô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 hiển thị. –

21

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ĩ rằng điều này cần phải là '-maxdepth 1'? –

+0

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

13

Nếu bạn tìm kiếm giải pháp phù hợp POSIX:

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

-maxdepth không được POSIX lựa chọn phù hợp.

+0

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

+0

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

Các vấn đề liên quan