files español content linux bash grep

linux - español - ls grep



Parámetro grep array de archivos excluidos (5)

GNU grep también admite la --exclude-from , que toma un nombre de archivo como argumento, con los archivos referenciados que contienen los patrones para excluir, cada uno en su propia línea.

Si no está preocupado por los nombres de archivos con líneas nuevas incorporadas (rara vez es una preocupación), puede usar una sustitución de proceso de la siguiente manera para crear dicho archivo sobre la marcha:

grep -Rni "my text" --exclude-from=<(printf ''%s/n'' "${EXCLUDED_FILES[@]}")

Como comentario adicional: es mejor no usar nombres de mayúsculas y minúsculas de shell para evitar conflictos con variables de entorno y variables de shell especiales .

Quiero excluir algunos archivos de mi comando grep , para esto estoy usando el parámetro:

--exclude=excluded_file.ext

Para hacer más fácil de leer, quiero usar una matriz de bash con archivos excluidos:

EXCLUDED_FILES=("excluded_file.ext")

Luego pase $ {EXCLUDED_FILES} array a grep , como:

grep -Rni "my text" --exclude=${EXCLUDED_FILES}

¿Cómo puedo pasar una matriz como parámetro al comando grep ?


Las variables no se pasan a los programas como argumentos; los valores son Las variables (especialmente las matrices) se expanden por el shell en una o más palabras, y cada palabra se pasa como un argumento separado a un programa. En este caso específico, la opción --exclude toma un único nombre de archivo como argumento, por lo que debe crear múltiples argumentos --exclude=foo desde su matriz. Una opción:

for f in "${EXCLUDED_FILES[@]}"; do opts+=( --exclude="$f" ) done grep -Rni "my text" "${opts[@]}"


Los chicos de GNU realmente se equivocaron cuando dieron opciones de grep para find archivos. ¿Qué sigue - opciones para sort su salida o trotar caracteres o imprimir solo la head / tail de los resultados? La herramienta UNIX para buscar archivos tiene el nombre muy apropiado y obvio find . El grep herramienta UNIX también se llama acertadamente para "Asociar geográficamente una E xpresión R egular en un archivo y P rint el resultado".

Así que find encuentra archivos mientras grep imprime cadenas desde dentro de archivos que coinciden con una expresión regular - 2 propósitos muy diferentes y solo debe usar la herramienta correcta para cada trabajo como los diseñadores de UNIX intentaron:

findsarg=() for f in "${EXCLUDED_FILES[@]}" do findsarg+=( ''!'' -name "$f" ) done find . -type f "${findsarg[@]}" -exec grep -Hni "my text" {} +

Gracias a @gniourf_gniourf por su ayuda para obtener la sintaxis correcta para manejar nombres de archivos que contengan metacaracteres globbing y espacio en blanco.

Sin embargo, como se mencionó en otra parte, no utilice todos los nombres de mayúsculas para las variables no exportadas por convención y para evitar chocar con los nombres exportados / estándar.


No se puede pasar literalmente una matriz como parámetro a ningún comando. Todos los parámetros son cadenas.

Sin embargo, puede convertir su matriz en una cadena que contenga todos los elementos de la matriz, separados por un delimitador (un carácter de espacio por defecto). La sintaxis sería

grep -Rni "my text" --exclude="${EXCLUDED_FILES[*]}"

Debo señalar, sin embargo, que el argumento --exclude a GNU grep no funciona de esa manera. Su valor se toma como un único globo con el que filtrar los resultados. Esto difiere del comportamiento del argumento --exclude-from de tratar cada línea del archivo como un globo separado. Si desea especificar múltiples comodines de exclusión en la línea de comando, deberá dar un argumento --exclude por separado para cada uno.


Supongo que estás buscando esto:

grep -Rni "${excluded_files[@]/#/--exclude=}" "my text"

La expansión del parámetro "${excluded_files[@]/#/--exclude=}" se ampliará a la expansión de la matriz excluded_files con cada campo con prefijo --exclude= . Mira:

$ excluded_files=( ''*.txt'' ''*.stuff'' ) $ printf ''%s/n'' "${excluded_files[@]/#/--exclude=}" --exclude=*.txt --exclude=*.stuff