Wie kann ich den Befehl „find“ unter OS X standardmäßig auf das aktuelle Verzeichnis festlegen?

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

  •  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.:) :)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top