¿Cómo puedo hacer que el & # 8220; find & # 8221; ¿Comando en OS X predeterminado para el directorio actual?

StackOverflow https://stackoverflow.com/questions/194725

  •  10-07-2019
  •  | 
  •  

Pregunta

Soy un usuario de línea de comando pesado y uso el comando find ampliamente en los scripts de mi sistema de compilación. Sin embargo, en Mac OS X, cuando no estoy concentrado, a menudo obtengo resultados como este:

$ find -name \*.plist
find: illegal option -- n
find: illegal option -- a
find: illegal option -- m
find: illegal option -- e
find: *.plist: No such file or directory

Básicamente, olvidé agregar el pequeño punto:

$ find . -name \*.plist

Porque BSD find requiere la ruta y GNU find no (asume el directorio actual si no especifica uno). Utilizo Linux, Mac OS X y Cygwin a menudo al mismo tiempo, por lo que es muy beneficioso para mí que todas mis herramientas se comporten de la misma manera. Intenté escribir una función bash find que agregara " ./" si lo olvidé pero fallé Gracias por tu ayuda. :)

¿Fue útil?

Solución

Si no puede disciplinarse para usar find 'correctamente', entonces ¿por qué no instalar GNU find (desde findutils ) en un directorio en su RUTA antes del comando find del sistema.

Solía ??tener mi propia variante privada de cp que copiaba los archivos al directorio actual si el último elemento de la lista no era un directorio. Lo guardé en mi directorio personal bin durante muchos años, pero finalmente lo eliminé porque ya no utilicé la funcionalidad. (Mi 'cp.sh' fue escrito en 1987 y editado dos veces, en 1990 y 1997, como parte de los cambios en las anotaciones del sistema de control de versiones. Creo que lo eliminé alrededor de 1998. El principal problema con el script es que cp file1 file2 es ambiguo entre copiar un archivo sobre otro y copiar dos archivos en el directorio actual.)

Considere escribir su propio contenedor para buscar :

#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"

La segunda línea dice " si el argumento 1 no es un directorio, entonces ajuste los argumentos de la línea de comando para incluir un punto delante del resto del comando. Eso será confuso si alguna vez escribe:

~/bin/find /non-existent/directory -name '*.plist' -print

porque el directorio inexistente no es un directorio y el script agregará un punto a la línea de comando, el tipo de razón por la que dejé de usar mi comando privado cp .

Otros consejos

Instale GNU find en su lugar.

$ brew install findutils
$ alias find=gfind

¡Sí, funciona!

Si debe llamarlo 'buscar', entonces quiere:

alias find=/usr/bin/find\ .

en su .profile o .bash_profile o & # 8230 ;. Sustituya la ruta real (si no es / usr / bin / find) en su Mac OSX. Ingrese la ruta completa para evitar ciclos (bash normalmente interpretaría alias find = find sin problemas, pero mejor asegúrese).

Pero es mejor que no nombre el alias find (findl, myfind, etc.), porque se convertirá en un hábito y un problema para usted si lo prueba en otro sistema.

find ./ -name "*.plist"

editar : hmm, ¡puedo haber entendido mal la pregunta! si estuvieras loco, ¿qué tal si lo emulamos a través de un script de shell? rutinariamente mantengo scripts de utilidad aleatorios en ~ / .bin, y eso es lo primero en mi RUTA. si tuviera una configuración similar, tal vez podría hacer algo como: (¡no probado!)

#!/bin/sh
# remapping find!
CMD=`echo $1 | cut -c 1`
if [ $CMD = '-' ]
then
# pwd search
  /usr/bin/find ./ $*
else
# regular find
  /usr/bin/find $*
fi

Sugeriría que si está escribiendo scripts (que es más probable que se migren de un sistema a otro en algún momento en el futuro) que intente usar la forma más específica del comando, eso es especificar el " ;. " en lugar de confiar en un valor predeterminado. Por la misma razón, incluso podría sugerir escribir scripts sh en lugar de confiar en bash que podría no estar instalado en todas partes.

Probablemente esto no sea lo que desea, pero ¿qué tal: alias find = " find. "

o elija un nuevo nombre ( findl para find local?)

Es posible que desee ejecutar los comandos que se encuentran en este enlace: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools- in-mac-os-x /

Está un poco desactualizado, por ejemplo, descubrí que no tenía que agregar muchos comandos a mi ruta en absoluto.

Esto cubre su problema haciendo que su sistema use la utilidad de búsqueda no BSD del paquete findutils , al tiempo que instala otras herramientas que también desee.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top