Untuk setiap file yang cocok (yaitu setiap direktori), find
beralih ke direktori yang berisi itu (yaitu direktori induknya) dan menjalankan perintah yang ditentukan. Karena perintah itu tidak menggunakan nama pertandingan, itu tidak akan bertindak pada semua direktori. Untuk pohon direktori khusus ini, Anda lakukan
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Untuk membuat file di setiap direktori, Anda bisa menggunakan -exec
alih-alih -execdir
, asalkan implementasi Anda find
mengizinkan {}
di dalam argumen (kebanyakan, dan khususnya saya pikir semua):
find . -type d -exec touch {}/foo +
Untuk portabilitas POSIX, Anda perlu melakukan perakitan nama direktori dan nama basis file secara manual.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
atau (sedikit lebih cepat)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Atau, Anda dapat menggunakan pencocokan wildcard rekursif bash. Waspadalah bahwa (tidak seperti fitur yang sesuai di ksh dan zsh, dan tidak seperti find
perintah Anda ) bash berulang di bawah tautan simbolis ke direktori.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Solusi zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
status di bawah "-c": argumen setelah command_string ditugaskan untuk parameter posisi yang dimulai dengan $ 0, namun "untuk d" akan beralih melalui parameter posisi yang dimulai dengan $ 1. "_" adalah teks yang ditetapkan ke $ 0 dan tidak akan digunakan.