Come posso rendere & # 8220; find & # 8221; Comando su OS X predefinito alla directory corrente?

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

  •  10-07-2019
  •  | 
  •  

Domanda

Sono un utente pesante della riga di comando e utilizzo ampiamente il comando find negli script del mio sistema di compilazione. Tuttavia, su Mac OS X, quando non mi concentro, ricevo spesso output in questo modo:

$ 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

Fondamentalmente, ho dimenticato di aggiungere il puntino:

$ find . -name \*.plist

Poiché BSD find richiede il percorso e GNU find non lo fa (assume la directory corrente se non ne specifichi uno). Uso Linux, Mac OS X e Cygwin spesso tutti allo stesso tempo, quindi è di grande beneficio per me avere tutti i miei strumenti comportarsi allo stesso modo. Ho provato a scrivere una funzione bash find che ha aggiunto " ./" se dimenticavo, ma fallivo. Grazie per l'aiuto. :)

È stato utile?

Soluzione

Se non riesci a disciplinarti per usare find 'correttamente', allora perché non installare GNU find (da findutils ) in un directory sul PATH prima del comando find del sistema.

Avevo una mia variante privata di cp che copiava i file nella directory corrente se l'ultimo elemento nell'elenco non fosse una directory. L'ho tenuto nella mia directory bin personale per molti anni, ma alla fine l'ho rimosso perché non utilizzavo più la funzionalità. (Il mio "cp.sh" è stato scritto nel 1987 e modificato due volte, nel 1990 e nel 1997, come parte delle modifiche alle notazioni del sistema di controllo della versione. Penso di averlo rimosso intorno al 1998. Il problema principale con lo script è che cp file1 file2 è ambiguo tra la copia di un file su un altro e la copia di due file nella directory corrente.)

Valuta di scrivere il tuo wrapper per find :

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

La seconda riga dice " se l'argomento 1 non è una directory, allora regola gli argomenti della riga di comando per includere il punto prima del resto del comando. Ciò sarà fonte di confusione se si digita mai:

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

perché la directory inesistente non è una directory e lo script aggiungerà punto alla riga di comando, il tipo di motivo per cui ho smesso di usare il mio comando privato cp .

Altri suggerimenti

Installa invece GNU find.

$ brew install findutils
$ alias find=gfind

Yay, funziona!

Se devi chiamarlo 'trova', allora vuoi:

alias find=/usr/bin/find\ .

nel tuo .profile o .bash_profile o & # 8230 ;. Sostituisci il percorso reale (se non / usr / bin / find) sul tuo Mac OSX. Inserisci il percorso completo per evitare cicli (normalmente bash interpreterebbe alias find = find senza problemi, ma meglio essere sicuro).

Ma è meglio non nominare l'alias find (findl, myfind ecc.), perché diventerà un'abitudine e un problema per te se lo provi su un altro sistema.

find ./ -name "*.plist"

modifica : hmm, potrei aver frainteso la domanda! se fossi pazzo, che ne dici di emularlo tramite uno script di shell? mantengo regolarmente script di utilità casuali in ~ / .bin, e questa è la prima cosa nel mio PERCORSO. se avessi una configurazione simile forse potresti fare qualcosa del tipo: (non testato!)

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

Suggerirei che se stai scrivendo script (che hanno più probabilità di essere migrati da un sistema all'altro in futuro) dovresti provare a usare la forma più specifica del comando, che sta specificando il " ;. " invece di fare affidamento su un valore predefinito. Per lo stesso motivo, potrei anche suggerire di scrivere script sh invece di fare affidamento su bash che potrebbe non essere installato ovunque.

Questo probabilmente non è quello che vuoi ma che ne dici di: alias find = " find. "

o scegli un nuovo nome ( findl per trovare locale?)

Potresti voler eseguire i comandi presenti in questo link: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools- in-mac-os-x /

È un po 'obsoleto, ad esempio ho scoperto che non dovevo aggiungere molti comandi al mio percorso.

Questo copre il tuo problema facendo in modo che il tuo sistema usi l'utilità di ricerca Non BSD dal pacchetto findutils , installando anche altri strumenti che potresti desiderare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top