Dla każdego pasującego pliku (tj. Każdego katalogu) find
przełącza się na katalog, który go zawiera (tj. Jego katalog nadrzędny) i wykonuje określone polecenie. Ponieważ polecenie nie używa nazwy dopasowania, nigdy nie będzie działać na wszystkie katalogi. Dla tego konkretnego drzewa katalogów robisz
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
Aby utworzyć plik w każdym katalogu, możesz po prostu użyć -exec
zamiast -execdir
, pod warunkiem, że twoja implementacja find
pozwala {}
wewnątrz argumentu (większość tak, a w szczególności myślę, że wszystkie):
find . -type d -exec touch {}/foo +
Aby zapewnić przenośność POSIX, należy ręcznie złożyć nazwę katalogu i nazwę pliku bazowego.
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
lub (nieco szybciej)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
Alternatywnie możesz użyć rekurencyjnego dopasowywania symboli wieloznacznych bash. Uwaga: (w przeciwieństwie do odpowiedniej funkcji w ksh i zsh oraz w przeciwieństwie do twojego find
polecenia) bash powtarza się pod symbolicznymi linkami do katalogów.
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
Rozwiązanie Zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
stany pod „-c”: argumenty po łańcuchu komend są przypisywane do parametrów pozycyjnych rozpoczynających się od $ 0, jednak „for d” będzie iterował przez parametry pozycyjne rozpoczynające się od $ 1. „_” to tekst przypisany do 0 $ i nie będzie używany.