Her eşleşen dosya (yani her dizin) için, find
onu içeren dizine (yani ana dizine) geçer ve belirtilen komutu yürütür. Komut eşleşmenin adını kullanmadığından, hiçbir zaman tüm dizinlerde işlem yapmaz. Bu belirli dizin ağacı için
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Her dizinde bir dosya oluşturmak için tek yapmanız gereken kullanabilirsiniz -exec
yerine -execdir
uygulamanıza sağlanan find
verir {}
bir tartışma içine (çoğu ve özellikle tüm olanları sizce):
find . -type d -exec touch {}/foo +
POSIX taşınabilirliği için, dizin adının ve dosya tabanı adının birleştirilmesini el ile yapmanız gerekir.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
veya (biraz daha hızlı)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Alternatif olarak, bash'ın özyinelemeli joker karakter eşleştirmesini kullanabilirsiniz. (Ksh ve find
zsh'deki karşılık gelen özellikten farklı olarak ve komutunuzun aksine ) dizinlere sembolik bağlantılar altında bash yinelemelerine dikkat edin .
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Bir zsh çözümü:
touch ./**/(e\''REPLY+=foo'\')
man bash
"-c" altındaki durumlar: komut_dizesinden sonraki bağımsız değişkenler $ 0 ile başlayan konum parametrelerine atanır, ancak "for d" $ 1 ile başlayan konum parametreleri arasında yinelenir. "_", $ 0'a atanan ve kullanılmayacak olan metindir.