2008-10-11 9 views
14

Je suis un utilisateur de ligne de commande lourd et utilise la commande find de manière extensive dans mes scripts de système de construction. Cependant sous Mac OS X quand je ne suis pas concentrais, je reçois souvent sortie comme ceci:Comment puis-je rendre la commande "find" sous OS X par défaut dans le répertoire en cours?

$ 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 

Fondamentalement, j'ai oublié d'ajouter le petit point:

$ find . -name \*.plist 

Parce que BSD find nécessite le chemin et GNU find ne le fait pas (il assume le répertoire courant si vous n'en spécifiez pas un). J'utilise souvent Linux, Mac OS X et Cygwin en même temps, ce qui me permet de faire en sorte que tous mes outils se comportent de la même manière. J'ai essayé d'écrire une fonction bash find qui a ajouté "./" si j'ai oublié, mais j'ai échoué. Merci de votre aide. :)

Répondre

10

Si vous ne pouvez pas vous discipliner pour utiliser find « correctement », alors pourquoi ne pas installer GNU find (à partir findutils) dans un répertoire sur votre chemin devant de commande du système find.

J'avais l'habitude d'avoir ma propre variante privée de cp qui copierait des fichiers dans le répertoire courant si le dernier élément de la liste n'était pas un répertoire. J'ai gardé cela dans mon répertoire personnel pendant de nombreuses années - mais j'ai fini par l'enlever parce que je n'utilisais plus la fonctionnalité. (Mon 'cp.sh' a été écrit en 1987 et édité deux fois, en 1990 et 1997, dans le cadre des changements apportés aux notations du système de contrôle de version.) Je pense que je l'ai enlevé vers 1998. Le principal problème avec le script est cp file1 file2 copier un fichier sur un autre et copier deux fichiers dans le répertoire en cours.)

Pensez à écrire votre propre emballage à find:

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

La deuxième ligne dit « si l'argument 1 est pas un répertoire, puis ajustez les arguments de ligne de commande pour inclure points d'avance sur le reste de la commande. ce sera source de confusion si vous tapez jamais:

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

car le répertoire inexistant est pas un répertoire et le script ajoutera point à la ligne de commande - le genre de raison que je me suis arrêté en utilisant mon privé cp com mand.

+0

J'ai accepté cela car il correspond le mieux à mes besoins, merci beaucoup. – mxcl

4
find ./ -name "*.plist" 

modifier: hmm, je peut-être mal compris la question! Si vous étiez fou, que diriez-vous de l'émuler via un script shell? Je garde régulièrement des scripts utilitaires aléatoires dans ~/.bin, et c'est la première chose dans mon PATH. si vous aviez une configuration similaire peut-être que vous pourriez faire quelque chose comme: (! non testé)

#!/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

Super :) Merci. Bien que pas tout à fait parfait, car il ne gère pas: $ find qui devrait se convertir à: $ find ./ – mxcl

1

Ceci est probablement pas ce que vous voulez, mais que diriez-vous: alias find="find ."

ou choisir un nouveau nom (findl pour trouver locale ?)

+0

J'étais sur le point de proposer un alias mais alors rendu compte que cela ne fonctionnerait pas bien si vous * wanted * pour spécifier un chemin sur la ligne de commande find. –

+0

Il rechercherait dans le répertoire local ET le chemin que vous spécifiez. find n'est pas limité à un argument de chemin. – tzot

+0

Bien que si je spécifie un chemin, je ne veux probablement pas le chercher dans le répertoire courant. – mxcl

2

Je suggère que si vous écrivez des scripts (qui sont plus susceptibles d'être migrés d'un système à un autre dans le futur) que vous devriez essayer d'utiliser la forme plus spécifique de la commande, c'est en précisant le "." au lieu de s'appuyer sur un défaut. Pour la même raison, je pourrais même suggérer d'écrire des scripts sh au lieu de compter sur bash qui pourrait ne pas être installé partout.

+0

C'est un bon point. Vraiment, je devrais ajouter un script/une fonction sur les autres plates-formes qui renvoient la commande find si je ne spécifie pas le chemin. De cette façon, je ne commencerai pas à écrire des scripts qui pourraient casser pour différentes implémentations d'outils différents. – mxcl

+0

Pour cette même raison j'ai pris l'habitude d'utiliser l'action "-print" même sur find qui l'assume. – dmckee

6

Si vous devez l'appeler 'trouver', alors vous voulez:

alias find=/usr/bin/find\ . 

dans votre .profile ou .bash_profile ou .... Remplacez le chemin réel (sinon/usr/bin/find) sur votre Mac OSX. Entrez le chemin complet pour éviter les cycles (bash normalement interpréterait alias find=find sans problèmes, mais mieux vaut être sûr).

Mais mieux vaut ne pas nommer l'alias find (findl, myfind etc.), car cela deviendra une habitude et un problème pour vous si vous l'essayez sur un autre système.

+0

Je n'ai même jamais essayé cela car je ne pensais pas que find pouvait emprunter plusieurs chemins et je me suis donc dit que je ne serais pas capable de chercher d'autres chemins que celui en cours. Merci beaucoup :) – mxcl

+0

En fait, ce n'est pas bon. Puisque si je spécifie un chemin, il est peu probable que je veuille inclure le répertoire courant aussi. – mxcl

+0

Ce que vous dites est évident. Notez que personne ne vous oblige à assumer "." comme une cible par défaut pour trouver, sauf vous-même (vérifiez votre question!). – tzot

17

Installez plutôt GNU find.

$ brew install findutils 
$ alias find=gfind 

Yay, ça marche!

+0

Ce serait plus permanent: $ echo "alias find = 'gfind'" >> ~/.bash_profile – Brandon

+1

@Brandon: Sûrement, ce serait au lecteur de le faire :) –