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