Đối với mọi tệp phù hợp (tức là mọi thư mục), find
chuyển sang thư mục chứa tệp đó (tức là thư mục mẹ của nó) và thực thi lệnh được chỉ định. Vì lệnh không sử dụng tên của trận đấu, nên nó sẽ không bao giờ hành động trên tất cả các thư mục. Đối với cây thư mục cụ thể này, bạn đang làm
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Để tạo một tệp trong mọi thư mục, bạn chỉ cần sử dụng -exec
thay vì -execdir
, với điều kiện bạn thực hiện find
cho phép {}
bên trong một đối số (hầu hết, và đặc biệt tôi nghĩ tất cả các thư mục):
find . -type d -exec touch {}/foo +
Đối với tính di động POSIX, bạn sẽ cần phải thực hiện việc lắp ráp tên thư mục và tên cơ sở tệp theo cách thủ công.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
hoặc (nhanh hơn một chút)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Ngoài ra, bạn có thể sử dụng kết hợp ký tự đại diện đệ quy của bash. Coi chừng rằng (không giống như tính năng tương ứng trong ksh và zsh, và không giống như find
lệnh của bạn ) bash đệ quy dưới các liên kết tượng trưng đến các thư mục.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Một giải pháp zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
trạng thái trong "-c": đối số sau lệnh_ chuỗi được gán cho tham số vị trí bắt đầu bằng $ 0, tuy nhiên "for d" sẽ lặp lại thông qua vị trí bắt đầu bằng $ 1. "_" là văn bản được gán cho $ 0 và sẽ không được sử dụng.