Frage

Ich muss ein Skript schreiben, das alle ausführbaren Dateien in einem Verzeichnis findet. Also habe ich verschiedene Möglichkeiten versucht, es umzusetzen, und sie funktionieren tatsächlich. Aber ich frage mich, ob es eine schönere Möglichkeit gibt, dies zu tun.

Das war also mein erster Ansatz:

ls -Fla | grep \*$

Dies funktioniert einwandfrei, da das Flag -f die Arbeit für mich erledigt und zu jeder ausführbaren Datei einen Sternchen ergänzt, aber sagen wir, ich mag das Sternchenschild nicht.

Das war also der zweite Ansatz:

ls -la | grep -E ^-.{2}x 

Auch dies funktioniert gut, ich möchte einen Armaturenbrett als erster Charakter, dann interessiere ich mich nicht für die nächsten beiden Zeichen und der vierte Charakter muss ein x sein.

Die Anforderungen sind jedoch ein bisschen mehrdeutig, da ich nicht weiß, ob ich nach Benutzer, Gruppen oder anderen ausführbaren Genehmigungen suchen muss. Das würde also funktionieren:

ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x

Also teste ich den vierten, siebten und zehnten Charakter als x.

Jetzt meine eigentliche Frage, gibt es eine bessere Lösung mit LS und Grep mit Regex zu sagen:

Ich möchte nur diese Dateien grepieren und mindestens ein X in den zehn ersten Zeichen einer Zeile haben, die von von erstellt wurde ls -la

War es hilfreich?

Lösung

Müssen Sie LS verwenden? Sie können Find verwenden, um dasselbe zu tun:

find . -maxdepth 1 -perm -111 -type f

Gibt alle ausführbaren Dateien im aktuellen Verzeichnis zurück. Entfernen Sie die Flagge -MaxDept, um alle Kinderverzeichnisse zu durchqueren.

Sie könnten diese Schrecklichkeit versuchen, aber sie könnte Dateien übereinstimmen, die Strings enthalten, die wie Berechtigungen aussehen.

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"

Andere Tipps

Wenn Sie unbedingt LS und Grep verwenden müssen, funktioniert dies:

ls -Fla | grep '^\S*x\S*'

Es entspricht Zeilen, in denen das erste Wort (Nicht-Whitespace) mindestens ein 'x' enthält.

Finden ist das perfekte Werkzeug dafür. Dies findet alle Dateien (-Typen f), die ausführbar sind:

find . -type f -executable

Wenn Sie nicht möchten, dass es alle ausführbaren Ausführungsbereiche rekursiv auflistet, verwenden Sie MaxDepth:

find . -maxdepth 1 -type f -executable

Vielleicht mit Test -x?

for f in $(\ls) ; do test -x $f && echo $f ; done

Das on ls wird Shell -Aliase umgehen.

for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done

Dies verleiht den ausführbaren Sachen absolute Wege.

file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top