So führen Sie ein ausführbares Programm mit Filter aus

So führen Sie ein ausführbares Programm mit Filter aus

Ich möchte ein Shell-Skript ausführen. Dieses Skript hat einen langen Namen. Daher möchte ich einen Filter für die Datei verwenden.

ex:ls | grep myfile | ./

Ist es möglich, eine Datei mit Filter auszuführen?

Antwort1

Schreib einfach:

*myfile*

Sie können außerdem Folgendes tun:

"$(ls | grep pattern)"

wenn Sie eine vollständige Übereinstimmung mit regulären Ausdrücken und nicht nur mit Platzhaltern für Dateinamen verwenden.

Alle diese Lösungen gehen davon aus, dass es im aktuellen Verzeichnis nur eine einzige Datei gibt, die dem Muster entspricht.

Antwort2

Sie könnenxargsfür so etwas:

ls | grep myfile | xargs sh

xargsliest Zeilen seiner Eingabe und gibt sie als Argumente an das Programm weiter, das ihm als Argument übergeben wurde: hier wird die Ausgabe von grep gelesen und dann ausgeführt sh long_myfile_name. (Ändern Sie shdies zu bash, wenn Ihr Skript von Bash-spezifischen Funktionen oder einer anderen Shell abhängt.)

Sie können es auch sh *myfile*in diesem einfachen Fall im Wesentlichen mit der gleichen Wirkung ausführen. Wenn Ihr Fall grepkomplizierter ist, ist dies möglicherweise nicht möglich, es sh "$(ls | grep ...)"wird aber funktionieren.


Allerdings gibt es einige Gründe, dies nicht zu tun: insbesondere, wenn die Möglichkeit besteht, dass irgendwann zwei Dateien vorhanden sind, die mit Ihrem übereinstimmen grep. An diesem Punkt wird eines von drei Dingen passieren: Ihr Skript erhält ein zusätzliches Argument, zwei verschiedene Skripte werden ausgeführt oder stattdessen wird ein anderes Skript ausgeführt. Sie könnten beispielsweise eine Pipe verwenden, head -n 1um die ersten beiden zu vermeiden, aber dann wird ein beliebiges Skript ausgeführt, was nicht viel hilft. In diesem $()Fall schlägt es einfach fehl, was wahrscheinlich das beste von mehreren schlechten Ergebnissen ist. Wenn die Dateinamen Leerzeichen enthalten, müssen Sie noch vorsichtiger sein.

Die Tab-Vervollständigung Ihrer Shell ist möglicherweise eine bessere Option: Sie können wahrscheinlich schreiben *myfile*und TAB drücken, um entweder eine korrekte Erweiterung oder einen Hinweis darauf zu erhalten, dass es mehr als eine Möglichkeit gibt, oder sogar einfach mit dem Schreiben des Namens beginnen und bis zum Ende tab-vervollständigen. Wenn Sie dies in einem Skript ausführen, geben Sie dort einfach den vollständigen Namen ein – Sie müssen ihn nur einmal schreiben. Die Antwort über der Zeile funktioniert, aber ich empfehle sie nicht wirklich.

Antwort3

Sie können xargszum Beispiel verwenden

ls | grep myfile | xargs bash

oder filtern Sie nachfind

find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;

verwandte Informationen