Además de mi consulta publicada: Usando buscar con sh - el comando no funciona
Según la operación del siguiente comando, necesito actualizar el permiso a 777 para cada uno de los archivos que se enumeran.
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
¿Hay alguna forma de canalizar la salida chmod
y actualizar los permisos de los archivos?
Respuesta1
Puede agregar otro -exec
para find
ejecutar chmod
en los archivos. Elimina el -ls
si no lo necesitas:
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
-ls -exec chmod 777 {} +
Respuesta2
Puede agregar otro -exec
al final para actualizar los permisos de los archivos que pasan las pruebas anteriores.como muestra freddy, o puede combinar grep
y chmod
en un sh -c
script en línea:
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 {} +
Esto se utilizaría find
como una especie de generador de nombres de ruta para el bucle en el sh -c
script.
Este bucle toma todos los nombres de ruta proporcionados al script en línea, prueba cada uno con grep
y, si el patrón coincide en un archivo, ese archivo obtiene sus permisos (posiblemente) actualizados.
En bash
, puede, en lugar de generar los nombres de ruta mediante find
, utilizar un patrón global de nombres de archivos:
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
La única diferencia visible aquí es que esto también procesaría enlaces simbólicos que coincidan con el patrón.
La globstar
opción de shell habilita el **
patrón que coincide recursivamente en subdirectorios. La nullglob
opción de shell hace que los patrones que no coinciden desaparezcan en lugar de permanecer sin expandirse. La dotglob
opción Shell hace que los patrones coincidan con nombres ocultos.
En el zsh
caparazón, esto puede acortarse a
for pathname in ./**/*FW*(.ND); do
if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
then
chmod 777 $pathname
fi
done
... donde .
, N
y D
corresponde a la -f
prueba (pero no coincidirá con enlaces simbólicos), configurando nullglob
y configurando dotglob
en bash
, a su vez.