Seguindo minha consulta postada - Usando find com sh - comando não funciona
Com base no o/p do comando abaixo, preciso atualizar a permissão para 777 para cada um dos arquivos listados.
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
Existe alguma maneira de canalizar a saída chmod
e atualizar as permissões do arquivo?
Responder1
Você pode adicionar outro -exec
para find
executar chmod
nos arquivos. Remova o -ls
se não precisar dele:
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
-ls -exec chmod 777 {} +
Responder2
Você pode adicionar outro -exec
no final para atualizar as permissões nos arquivos que passam nos testes anteriores,como Freddy mostra, ou você pode combinar grep
e chmod
em um sh -c
script embutido:
find . -type f -name '*FW*' -exec sh -c '
for pathname do
if grep -q -i -e "chmod.*archive" -e "archive.*chmod" "$pathname"
then
chmod 777 "$pathname"
fi
done' sh {} +
Isso seria usado find
como uma espécie de gerador de nomes de caminhos para o loop no sh -c
script.
Este loop pega todos os nomes de caminho fornecidos ao script embutido, testa cada um deles com grep
e, se o padrão corresponder em um arquivo, esse arquivo terá suas permissões (possivelmente) atualizadas.
Em bash
, você pode, em vez de gerar os nomes de caminho por find
, usar um padrão globbing de nome de arquivo:
shopt -s globstar nullglob dotglob
for pathname in ./**/*FW*; do
if [ -f "$pathname" ] && grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' "$pathname"
then
chmod 777 "$pathname"
fi
done
A única diferença visível aqui é que isso também processaria links simbólicos que correspondam ao padrão.
A globstar
opção shell habilita o **
padrão que corresponde recursivamente em subdiretórios. A nullglob
opção shell faz com que os padrões não correspondentes desapareçam em vez de permanecerem sem expansão. A dotglob
opção shell faz com que os padrões correspondam a nomes ocultos.
No zsh
shell, isso pode ser abreviado para
for pathname in ./**/*FW*(.ND); do
if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
then
chmod 777 $pathname
fi
done
... onde .
, N
e D
corresponde ao -f
teste (mas não corresponde a links simbólicos), configurando nullglob
e configurando dotglob
, bash
por sua vez.