salida de tubería del comando de búsqueda

salida de tubería del comando de búsqueda

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 chmody actualizar los permisos de los archivos?

Respuesta1

Puede agregar otro -execpara findejecutar chmoden los archivos. Elimina el -lssi no lo necesitas:

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
  -ls -exec chmod 777 {} +

Respuesta2

Puede agregar otro -execal final para actualizar los permisos de los archivos que pasan las pruebas anteriores.como muestra freddy, o puede combinar grepy chmoden un sh -cscript 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 findcomo una especie de generador de nombres de ruta para el bucle en el sh -cscript.

Este bucle toma todos los nombres de ruta proporcionados al script en línea, prueba cada uno con grepy, 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 globstaropción de shell habilita el **patrón que coincide recursivamente en subdirectorios. La nullglobopción de shell hace que los patrones que no coinciden desaparezcan en lugar de permanecer sin expandirse. La dotglobopción Shell hace que los patrones coincidan con nombres ocultos.

En el zshcaparazó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 ., Ny Dcorresponde a la -fprueba (pero no coincidirá con enlaces simbólicos), configurando nullgloby configurando dotgloben bash, a su vez.

información relacionada