Jeśli chodzi o find
polecenie, możesz także po prostu dodać więcej -exec
poleceń z rzędu:
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
Zauważ, że w rezultacie to polecenie jest równoważne użyciu
chgrp -v plik nowa_grupa && chmod -v 770 plik
na każdym pliku.
Wszystkie find
„s parametry, takie jak -name
, -exec
, -size
i tak dalej, są rzeczywiście testuje : find
będą działać je jeden po drugim, tak długo jak cały łańcuch dotychczas oceniano na prawdziwe . Tak więc każde kolejne -exec
polecenie jest wykonywane tylko wtedy, gdy poprzednie zwróciły wartość true (tzn. 0
Status wyjścia poleceń). Ale find
rozumie także operatory logiczne, takie jak lub ( -o
) i not ( !
). Dlatego, aby użyć łańcucha -exec
testów niezależnie od poprzednich wyników, należałoby użyć czegoś takiego:
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
'{}'
(apostrofy wokół nawiasów klamrowych), odwiedź: unix.stackexchange.com/q/8647/4485źródło
-c
dziwnego obchodzenia się z 0 $ sprawiają, że za każdym razem, gdy na niego patrzę, myślę, że to jest złe, ale zdecydowanie poprawne.sh -c
.Twoje polecenie jest najpierw analizowane przez powłokę na dwa polecenia oddzielone znakiem a
;
, co jest równoważne nowej linii:Jeśli chcesz uruchomić polecenie powłoki, jawnie wywołaj powłokę za pomocą
bash -c
(lubsh -c
jeśli nie obchodzi cię, że powłoka jest specjalnie bash):Zwróć uwagę na użycie
{}
jako argumentu dla powłoki; jest to zerowy argument (który zwykle jest nazwą powłoki lub skryptu, ale nie ma to tutaj znaczenia), stąd też nazywany"$0"
.Możesz przekazać wiele nazw plików do powłoki jednocześnie i sprawić, że powłoka będzie się przez nie iterować, będzie to szybsze. Podaję tutaj
_
jako nazwę skryptu, a następujące argumenty to nazwy plików, którefor x
(skrót dofor x in "$@"
) iterują.Zauważ, że odkąd bash 4 lub w zsh, tutaj wcale nie musisz go znaleźć. W bash, uruchom
shopt -s globstar
(włóż to do swojego~/.bashrc
), aby aktywować tryb**/
stojący dla globalnego katalogu rekurencyjnego. (W Zsh jest to aktywne przez cały czas.) Następnielub jeśli chcesz, aby pliki były iterowane w kolejności
Jedną różnicą w stosunku do
find
polecenia jest to, że powłoka ignoruje pliki kropkowe (pliki, których nazwa zaczyna się od a.
). Aby je uwzględnić, w bash, pierwszy zestawGLOBIGNORE=.:..
; w zsh użyj**/*(D)
jako wzorca globu.źródło
sh -c
.