Wie kann ich den Befehl „find“ unter OS X standardmäßig auf das aktuelle Verzeichnis festlegen?
-
10-07-2019 - |
Frage
Ich bin ein starker Befehlszeilenbenutzer und verwende die find
Befehl ausführlich in meinen Build-System-Skripten.Unter Mac OS
$ 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
Im Grunde habe ich vergessen, den kleinen Punkt hinzuzufügen:
$ find . -name \*.plist
Weil BSD find
erfordert den Pfad und GNU find
nicht (es wird das aktuelle Verzeichnis angenommen, wenn Sie keins angeben).Ich verwende Linux, Mac OSIch habe versucht, eine Bash zu schreiben find
Funktion, die „./“ hinzufügte, falls ich es vergessen habe, aber ich habe versagt.Vielen Dank für Ihre Hilfe.:) :)
Lösung
Wenn Sie nicht disziplinieren können sie find
verwenden ‚richtig‘, warum dann nicht GNU find
installieren (von findutils
) in einem Verzeichnis auf dem Weg vor dem System find
Befehls.
Früher habe ich meine eigene Variante von cp
habe, die Dateien in das aktuellen Verzeichnis kopiert werden würde, wenn der letzte Eintrag in der Liste kein Verzeichnis ist. Ich halte, dass in meinem persönlichen bin
Verzeichnis seit vielen Jahren - aber schließlich entfernt, weil ich nicht mehr verwendet, um die Funktionalität. (My ‚cp.sh‘ wurde 1987 geschrieben und zweimal bearbeitet, in den Jahren 1990 und 1997 im Rahmen von Änderungen an Versionskontrollsystem Notationen. Ich glaube, ich nahm es um 1998. Das primäre Problem mit dem Skript ist, dass cp file1 file2
ist nicht eindeutig zwischen Kopieren einer Datei über eine andere und das Kopieren von zwei Dateien in das aktuelle Verzeichnis.)
Betrachten Sie Ihre eigenen Wrapper schreiben find
:
#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"
Die zweite Zeile sagt „, wenn Argument 1 kein Verzeichnis ist, dann die Befehlszeilenargumente einstellen Punkt vor dem Rest des Befehls enthalten, die verwirrend sein, wenn Sie jemals geben.
~/bin/find /non-existent/directory -name '*.plist' -print
, weil das nicht vorhandene Verzeichnis ist kein Verzeichnis und das Skript wird Punkt auf die Kommandozeile hinzufügen -. Die Art von Grunde, dass ich meinen privaten cp
Befehl gestoppt mit
Andere Tipps
Installieren Sie GNU statt finden.
$ brew install findutils
$ alias find=gfind
Yay, es funktioniert!
Wenn Sie es „finden“ nennen müssen, dann möchten Sie:
alias find=/usr/bin/find\ .
in deinem .profile oder .bash_profile oder ….Ersetzen Sie den tatsächlichen Pfad (falls nicht /usr/bin/find) auf Ihrem Mac OSX.Geben Sie den vollständigen Pfad ein, um Zyklen zu vermeiden (normalerweise würde Bash interpretieren). alias find=find
ohne Probleme, aber seien Sie besser sicher).
Aber nennen Sie den Alias besser nicht find
(findl, myfind usw.), da es für Sie zur Gewohnheit und zum Problem wird, wenn Sie es auf einem anderen System ausprobieren.
find ./ -name "*.plist"
Bearbeiten : hmm, ich die Frage falsch verstanden haben! wenn Sie verrückt sind, wie man über einen Shell-Skript zu emulieren? i halten routinemäßig zufällig Dienstprogramm Skripts in ~ / .bin, und das ist das erste, was mir in den Weg. wenn Sie ein ähnliches Setup haben vielleicht könnten Sie so etwas wie: (! ungetestet)
#!/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
Ich würde vorschlagen, dass, wenn Sie Skripte gerade schreiben (was eher zu von einem System zum anderen in der Zukunft migriert werden), die Sie versuchen sollten, die speziellere Form des Befehls zu verwenden, dh die Angabe der " .“ statt auf einem Standard zu verlassen. Aus dem gleichen Grund kann, schlage ich vor, auch sh
Skripte, anstatt sich auf bash
Schreiben, die überall werden möglicherweise nicht installiert ist.
Dies ist wahrscheinlich nicht das, was Sie wollen, aber wie wäre es: alias find="find ."
oder wählen Sie einen neuen Namen (findl
für finden lokale?)
können Sie möchten die Befehle in diesem Link ausführen: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools- in-mac-os-x /
Es ist ein bisschen veraltet, zum Beispiel ich finde ich nicht viele Befehle auf meinen Weg überhaupt hinzufügen musste.
Dies umfasst Ihr Problem von Ihrem System den Nicht-BSD Fund-Dienstprogramm aus dem findutils
Paket verwenden zu müssen, während auch andere Tools zu installieren Sie auch mögen.