2008-10-11 13 views
14

Soy un usuario de línea de comando pesado y uso el comando find extensamente en mis scripts del sistema de compilación. Sin embargo en Mac OS X cuando yo no estoy concentrando A menudo recibo salida como esta:¿Cómo puedo hacer que el comando "buscar" en OS X sea el directorio actual?

$ 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, se me olvidó añadir el pequeño punto:

$ find . -name \*.plist 

Debido 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, todo al mismo tiempo, por lo que es de gran beneficio para mí que todas mis herramientas se comporten de la misma manera. Traté de escribir una función bash find que agregó "./" si lo olvidé, pero fallé. Gracias por tu ayuda. :)

Respuesta

10

Si no puede disciplinarse para usar find 'correctamente', entonces ¿por qué no instalar GNU find (de findutils) en un directorio en su camino por delante del sistema de mando find.

Solía ​​tener mi propia variante privada de cp que copiaba los archivos en el 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 usaba la funcionalidad. (Mi 'cp.sh' fue escrito en 1987 y editado dos veces, en 1990 y 1997, como parte de los cambios en las notaciones del sistema de control de versiones. Creo que lo eliminé alrededor de 1998. El problema principal con el script es que cp file1 file2 es ambiguo entre copiar un archivo sobre otro y copiar dos archivos al directorio actual.)

que no escribe su propio envoltorio a find:

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

La segunda línea dice "si el argumento 1 no es un directorio, a continuación, ajustar los argumentos de línea de comandos para incluir puntos por delante del resto de la orden. eso va a ser confuso si alguna vez escribe:

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

porque el directorio no existe, no es un directorio y el guión se sumará puntos a la línea de comandos - el tipo de razón por la que dejé de usar mi privado cp com mand.

+0

Lo acepté porque se adapta mejor a mis necesidades, muchas gracias. – mxcl

4
find ./ -name "*.plist" 

edición: Hmm, puede haber entendido mal la pregunta! si estabas loco, ¿qué tal emularlo a través de un script de shell? Rutinariamente guardo scripts de utilidad aleatoria en ~/.bin, y eso es lo primero en mi PATH. si tenía 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 
+0

Genial :) Gracias. Aunque no es perfecto, ya que no maneja: $ encuentran cual debería quedar convertida en: $ find ./ – mxcl

1

Esto probablemente no es lo que quiere, pero ¿qué tal: alias find="find ."

o elegir un nuevo nombre (findl para encontrar locales ?)

+0

yo estaba a punto de sugerir un alias, pero luego se dio cuenta de que no iba a funcionar a bien si * quería * especificar una ruta en la línea de comando de búsqueda. –

+0

Buscaría en el directorio local Y en la ruta que especifique. Encontrar no está restringido a un argumento de ruta. – tzot

+0

Aunque si especifico una ruta, probablemente tampoco la quiera buscar en el directorio actual. – mxcl

2

Sugeriría que si está escribiendo scripts (que es más probable que migren de un sistema a otro en el futuro) intente usar la forma más específica del comando, eso es especificando el "." en lugar de confiar en un valor predeterminado. Por el mismo motivo, incluso podría sugerir escribir las secuencias de comandos sh en lugar de confiar en bash, que podría no estar instalado en todas partes.

+0

Este es un buen punto. Realmente debería agregar un script/función en las otras plataformas que rescata el comando find si no especifico la ruta. De esa manera, no comenzaré a escribir scripts que puedan romperse para diferentes implementaciones de varias herramientas. – mxcl

+0

Por esta misma razón, he adquirido el hábito de usar la acción "-print" incluso en el momento que lo asumo. – dmckee

6

Si tiene que llamar 'encontrar', entonces usted quiere:

alias find=/usr/bin/find\ . 

en su .profile o .bash_profile o .... 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 es mejor asegurarse).

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

+0

Nunca lo intenté, ya que no creía que Find pudiera tomar múltiples caminos y, por lo tanto, pensé que no sería capaz de buscar rutas distintas a la actual. Muchas gracias :) – mxcl

+0

En realidad, esto no es bueno. Dado que si especifico una ruta, es poco probable que quiera incluir también el directorio actual. – mxcl

+0

Lo que dices es obvio. Tenga en cuenta que nadie le obliga a asumir "." como objetivo predeterminado para find, excepto usted mismo (¡consulte su pregunta!). – tzot

17

Instale GNU find en su lugar.

$ brew install findutils 
$ alias find=gfind 

Yay, it works!

+0

Esto sería más permanente: $ echo "alias find = 'gfind'" >> ~/.bash_profile – Brandon

+1

@Brandon: Seguramente, eso le corresponde al lector hacerlo :) –

0

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/

Es un poco anticuado, por ejemplo, me encontré con que no tenía que añadir los comandos pueden a mi camino en absoluto.

Esto cubre su problema haciendo que su sistema use la utilidad de búsqueda No-BSD del paquete findutils, mientras que también instala otras herramientas que también podría necesitar.

Cuestiones relacionadas