Именованные параметры функции bash [дубликат]

find. | grep usery find. -path "user*"hacen dos cosas muy diferentes. Pueden parecer que son lo mismo, pero no lo son.

Mencionaré primero las dos diferencias más obvias solo para quitarlas de en medio. La primera es que necesitaría usar -path '*user*'para obtener exactamente el mismo resultado que grep user... esto no es muy importante. La segunda diferencia obvia, un poco más importante, es que ejecutar dos procesos cuando uno lo hará es inherentemente menos eficiente (en términos de uso de CPU y RAM)-una eficiencia más significativa que ahorrar dos pulsaciones de teclas.

Sin embargo, la verdadera diferencia es lo que puede hacer fácilmente con los nombres de archivo encontrados por findy los que se encuentran usando grep. Como la mayoría de las utilidades de línea de comandos en Linux/Unix, findes una herramienta muy flexible -que es capaz de mucho más que simplemente encontrar archivos e imprimir sus nombres.

Con la tubería a grep, lo que tiene es solo una lista de texto de nombres de archivo que coinciden con un patrón particular.

Si ha utilizado un carácter NUL como separador de nombre de archivo en lugar de solo una nueva línea (w.g. con la acción -print0de find y la opción )de GNU grep-z, también conocida como --null-data, puede canalizarla con seguridad enxargs -0(o perlo awko cualquier otro programa que pueda tomar NUL -entrada separada )y procesar los archivos.

por ej. usando du -schcomo un ejemplo muy simple:

find. -print0 | grep -z user | xargs -0r du -sch --

Si no hizo eso, o si su versión de grepno es compatible con -z, solo puede procesar con seguridad sus nombres de archivo si a )usa una nueva línea como separador de nombre de archivo y b )] está absolutamente seguro de que ninguno de los nombres de archivo contendrá una nueva línea (las nuevas líneas son válidas en los nombres de archivo -molestas pero ciertas, y algo con lo que ocasionalmente tiene que lidiar ).

find. | grep user | xargs -d '\n' -r du -sch --

Ambos usan 4 procesos (find, grep, xargs y du )en una tubería para el uso total del disco de los nombres de archivo.

Con find, sin embargo, puede usar las opciones -execo -execdirpara procesar directamente el nombre del archivo sin tener que preocuparse por el delimitador que está usando.

por ej.

find. -path '*user*' -exec du -sch -- {} +

Esto utiliza 2 procesos (find y du )para lograr el mismo resultado.

La ​​segunda diferencia real (y esta es una grande )es que mientras grepsolo puede seleccionar archivos haciendo coincidir un patrón de expresiones regulares con el nombre de cada archivo, findpuede usar los metadatos de cada archivo para filtrar coincidencias no deseadas (o para seleccionar solo coincidencias muy específicas -lo mismo)

Algunos ejemplos de lo que findes capaz de:

Si solo quiere archivos regulares, use -type f, si solo quiere directorios, use -type d, enlaces simbólicos -type ly así sucesivamente.

Si desea que solo los archivos sean propiedad de un usuario en particular, use -uid nnno -user username..lo mismo para -gid nnny -group groupname.

findpuede coincidir con los permisos, las marcas de tiempo, el tamaño y si un archivo es -readableo -writablepor el usuario que lo ejecuta.

También ha incorporado la coincidencia de expresiones regulares (-regex, con una selección de estilos de expresiones regulares usando -regextype), así como la coincidencia global (-name,-path).

Puede usar -prunepara excluir árboles de subdirectorios completos de la búsqueda (reduciendo la cantidad de E/S del disco y el tiempo requerido ).

Puede combinar todos estos con los operadores lógicos booleanos AND, OR y NOT.

findtambién tiene varias acciones integradas. El valor predeterminado es -print, y ya he mencionado -print0. También puede generar cualquiera de los metadatos disponibles de un archivo en cualquier formato que desee con su acción -printf. Puede eliminar archivos con -deleteo generar una lista detallada (similar als -l)con -ls.

-execejecuta cualquier proceso externo y le da la lista de archivos coincidentes en la línea de comando con {}. Ya sea un archivo a la vez si finaliza el comando -execcon \;o tantos como quepan en una línea de comando de shell a la vez con +.

-execdirhace lo mismo pero, si usa \;cambia al directorio de cada archivo antes de ejecutar el proceso externo. Con +cambia al directorio y luego ejecuta el comando externo con tantos argumentos de nombre de archivo como quepan en una línea de comando.

Por cierto, algunos de los predicados y acciones de búsqueda anteriores son extensiones GNU, y es posible que no funcionen en otras versiones que no sean -GNU de find.

1
02.03.2018, 05:30
2 ответа

Las funciones en Bash actualmente no admiten argumentos con nombre de usuario -.

5
28.04.2021, 23:49

Этот обходной путь может помочь, но он недостаточно проверен:

fun () {
    v1=$1
    v2=$2
    for v in "$v1" "$v2"
    do
       case "$v" in
           name=*) name=${v/*=/};;
           age=*)  age=${v/*=/};;
           *)    echo "unexpected $v, please use name and age" ;;
       esac
    done

    echo "name=$name age=$age"
}

выход:

fun "name=John" "age=22"
name=John age=22
fun "age=22" "name=John"
name=John age=22
2
28.04.2021, 23:49

Теги

Похожие вопросы