Quanto ao find
comando, você também pode adicionar mais -exec
comandos em uma linha:
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
Observe que este comando é, em seu resultado, equivalente ao uso de
Arquivo chgrp -v new_group & arquivo & chmod -v 770
em cada arquivo.
Todos os find
parâmetros 's tais como -name
, -exec
, -size
e assim por diante, são realmente testa : find
continuará a executá-los um por um, desde que toda a cadeia até o momento avaliou a verdade . Portanto, cada -exec
comando consecutivo é executado apenas se os anteriores retornarem true (ou seja, 0
status de saída dos comandos). Mas find
também entende operadores lógicos como or ( -o
) e não ( !
). Portanto, para usar uma cadeia de -exec
testes independentemente dos resultados anteriores, seria necessário usar algo como isto:
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
'{}'
(apóstrofos ao redor do aparelho), visite: unix.stackexchange.com/q/8647/4485fonte
-c
manuseio estranho de US $ 0 me fazem pensar que isso está errado toda vez que olho para ele, mas é definitivamente correto.sh -c
.Seu comando é primeiro analisado pelo shell em dois comandos separados por a
;
, o que é equivalente a uma nova linha:Se você deseja executar um comando do shell, chame um shell explicitamente com
bash -c
(oush -c
se você não se importa que o shell seja especificamente do bash):Observe o uso de
{}
como um argumento para o shell; é o argumento zeroth (que normalmente é o nome do shell ou script, mas isso não importa aqui), portanto referido como"$0"
.Você pode passar vários nomes de arquivos para o shell de cada vez e fazer com que o shell itere através deles, será mais rápido. Aqui passo
_
como o nome do script e os argumentos a seguir são nomes de arquivos, quefor x
(um atalho parafor x in "$@"
) iteram.Observe que desde o bash 4, ou no zsh, você não precisa encontrar nada aqui. No bash, execute
shopt -s globstar
(coloque-o no seu~/.bashrc
) para ativar a**/
posição de um diretório recursivo glob. (No zsh, isso fica ativo o tempo todo.)ou se você deseja que os arquivos sejam iterados em ordem
Uma diferença com o
find
comando é que o shell ignora arquivos de ponto (arquivos cujo nome começa com a.
). Para incluí-los, no bash, primeiro conjuntoGLOBIGNORE=.:..
; no zsh, use**/*(D)
como padrão glob.fonte
sh -c
.