Wie kann ich den Befehl find mit anderen Befehlen kombinieren, damit ich nicht zum Ordner navigieren muss?

7

Manchmal möchte ich bestimmte Dateien ausführen, aber nicht bis zum Ordner navigieren.

Wenn ich den Dateinamen kenne und find -name file_name.pynur ein Ergebnis zurückgebe, kann ich das einfach verwenden?

Anstatt beispielsweise zu einem bestimmten Ordner zu navigieren und Folgendes aufzurufen:

python file_name.py

Kann ich schreiben:

python [ find -name file_name.py ] 

oder

python [ locate file_name.py ]

Oder eine Variante für "Durchsuche meinen gesamten Computer nach diesem Dateinamen und verwende ihn"? Am besten in einer Zeile.

Charles Clayton
quelle
Suchen Sie nicht die neuesten Ergebnisse.
Braiam
Mit welchem ​​Texteditor bearbeiten Sie diese Dateien? Ich würde vorschlagen, einen Texteditor zu verwenden, mit dem Sie einfach nach Dateien im aktuellen Verzeichnis suchen können. Zum Beispiel mit vim und der CtrlP Erweiterung könnten Sie geben Ctrl-pdann filenamedie Datei zu finden. Die ungefähre ungefähre Zeichenfolgenübereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung wird als Fuzzy-Übereinstimmung bezeichnet und ist eine häufige Funktion in Texteditoren.
Philip

Antworten:

12

Ich denke du suchst:

python $(find -name myscript.py)
RobotHumans
quelle
Ah! Es war dumm von mir, das zu vergessen $! Ich konnte nicht verstehen, warum Klammern nichts taten. Vielen Dank!
Charles Clayton
Die Verwendung von Python $ (find file_name.py) ist etwas kürzer.
Charles Clayton
Kürzer ja, aber wenn ich in einem Projektbaum wäre, würde ich finden. -name myscript.py, daher habe ich keine global installierte Kopie und keine Entwicklungskopie erhalten. Es gibt also weniger Unterschiede, wie ich es diese beiden Male verwenden würde.
RobotHumans
5

Fügen Sie die Zeile shopt -s globstarder Datei .bashrcin Ihrem Home-Verzeichnis hinzu. (Um dies einfach auszuprobieren, geben Sie dies in die Befehlszeile ein. Es wird nur in Ihrer aktuellen Shell wirksam.)

Dann können Sie **/"im aktuellen Verzeichnis oder in einem Unterverzeichnis usw. rekursiv" bedeuten, dh dasselbe wie einfache findBefehle.

python **/myscript.py

Vorsichtsmaßnahme: **/Durchläuft symbolische Links zu Verzeichnissen, findnicht jedoch. In Bash können Sie dies nicht vermeiden. In zsh **/ist es sofort verfügbar und durchläuft keine symbolischen Links (es gibt in ***/den seltenen Fällen Fälle, in denen Sie Symlinks durchlaufen möchten).

Gilles 'SO - hör auf böse zu sein'
quelle
Dieser ist definitiv der am schnellsten zu tippen (und wahrscheinlich auch mein Favorit)! Auf der anderen Seite kann es sehr lang sein, wenn Ihr Verzeichnis aufgebläht ist, da der Globbing-Mechanismus von bash das Sortieren der Dateien beinhaltet! In dieser Hinsicht findkönnten die beteiligten Methoden reaktionsfähiger sein.
gniourf_gniourf
@gniourf_gniourf Die Sortierung ist schnell und erfolgt im Speicher in der Zeit Θ (n log (n)), die zum Lesen nahe an Θ (n) liegt. **/ist etwas langsamer als findweil findes eine Optimierung hat, die keine statDateien in Blattverzeichnissen aufruft. Aufruf find …| …oder find … -exec … \;reaktionsschneller, da Dateien verarbeitet werden können, sobald sie gefunden wurden, aber $(find …)zuerst den gesamten Baum durchlaufen müssen, genau wie **/.
Gilles 'SO - hör auf böse zu sein'
Das ist auch sehr praktisch.
Charles Clayton
1

Nur um zu zeigen, dass es immer mehr als einen Weg gibt, Dinge zu tun (auch ohne Perl):

find -name file_name.py -exec python {} \;

funktioniert auch. Die exec-Option von find führt den folgenden Befehl für jede gefundene Datei aus. In diesem Befehl {}fungiert er als Platzhalter für die Datei und \;kennzeichnet das Ende des Befehls.

Jos
quelle
1
Wenn Sie -quitam Ende des findBefehls hinzufügen , ist dies eine gute Antwort:find -name file_name.py -exec python {} \; -quit
gniourf_gniourf
@gniourf_gniourf Ah, danke dafür. Ja, Sie möchten möglicherweise, dass der Befehl nach der Verarbeitung der ersten gefundenen Datei beendet wird.
Jos
0

Sie können die Ausgabe von find in einer Variablen speichern und damit wie folgt vorgehen:

file=`find -name file_name.py` && python $file

find -name file_name.pysucht nach benannten Dateien file_name.pyund speichert das Ergebnis in einer fileVariablen. Wenn der Befehl erfolgreich war (die Ergebnisse werden ohne Fehler erhalten), interpretiert Python $file.

Job in
quelle
0

Noch einer:

xargs -0 python < <(find -name my_script.py -print0 -quit)

Versuchen Sie nun als Hausaufgabe, die Vor-, Nachteile und Unterschiede aller hier vorgestellten Methoden zu ermitteln.

gniourf_gniourf
quelle