Quiero averiguar el tipo de varios comandos. ¿Es posible canalizar o xargs
un resultado de búsqueda desde find
el type
comando en Linux?
Por ejemplo:
find . -name anacron | type
o
find . -name anacron | xargs type
command-line
bash
find
LjinKazama
fuente
fuente
Respuestas:
type
No es un comando normal. Es una concha buitin. Ver:Por lo tanto, es necesario invocar
bash
a-c
lograr lo que quiereO incluso más simple (no es necesario
xargs
):Llamará
bash -c "type ./file"
, con cada archivo que encuentrefind
.-I
en elxargs
medio, definimos aquí un marcador{}
de posición para usar más adelante. Este marcador de posición se reemplaza con el nombre de archivo encontrado.¿Por qué las construcciones de conchas no funcionan con
xargs
:El comando en este caso es un simple ejecutable, y un shell incorporado no es un ejecutable. No se puede encontrar en el sistema de archivos. Está dentro del caparazón mismo. Entonces debe llamar al shell y decirle al shell llamado que invoque el comando incorporado. Eso es lo que sucedió
bash -c "command"
.fuente
find ... -exec bash -c 'type "$@"' _ {} +
Aquí hay algunos problemas (algunos ya resaltados):
type
Es un incorporado. No es un comando resuelto, es una función dentro de bash. Verman bash-builtins
. Solo funciona en el contexto de bash, por lo que no es un subshell bifurcadoxargs
o-exec
bifurcado.type
está acostumbrado a hacer su propia búsqueda de ruta. Si le das una ruta (comofind
es habitual), probablemente solo devolverá esa ruta.readlink -f
podría ser mejor si solo estás tratando de resolver enlaces simbólicos; y puedes entrarxargs readlink
o-exec readlink -f {} +
todo el día.Eso no quiere decir que no puedes hacer lo que estás tratando de hacer. Hay dos opciones El
type
comando puede manejar muchos nombres a la vez, por lo que puede proporcionarle todos los nombres a la vez:Para muchos comandos, si hay demasiados argumentos, excederá el límite de longitud de la línea de comando (ver
getconf ARG_MAX
). Sin embargo, eso no se aplicará en este caso, ya quetype
está integrado en el shell y no genera una nueva ID de proceso (el límite de longitud se aplica a la función exec () utilizada por el proceso secundario en una línea de comando normal).fuente