Hier ist eine vereinfachte Version mit erweiterten Erklärungen für Anfänger wie mich, die lernen möchten, wie man mehr als einen Befehl in eine Zeile setzt.
Wenn Sie das Problem schrittweise aufschreiben würden, würde es folgendermaßen aussehen:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Um dies zu erreichen, können wir drei UNIX - Befehle zur Verfügung : find
, file
, und grep
.
find
überprüft jede Datei im Verzeichnis.
file
wird uns den Dateityp geben. In unserem Fall suchen wir nach einer Rückgabe von 'ASCII-Text'
grep
sucht in der Ausgabe von nach dem Schlüsselwort 'ASCII' file
Wie können wir diese also in einer einzigen Zeile aneinander reihen? Es gibt mehrere Möglichkeiten, dies zu tun, aber ich finde, dass es am sinnvollsten ist, dies in der Reihenfolge unseres Pseudocodes zu tun (insbesondere für Anfänger wie mich).
find ./ -exec file {} ";" | grep 'ASCII'
Sieht kompliziert aus, ist aber nicht schlecht, wenn wir es aufschlüsseln:
find ./
= Durchsuche jede Datei in diesem Verzeichnis. Der find
Befehl druckt den Dateinamen einer Datei aus, die dem 'Ausdruck' entspricht, oder was auch immer nach dem Pfad steht, in unserem Fall das aktuelle Verzeichnis oder./
Das Wichtigste zu verstehen ist, dass alles nach diesem ersten Bit entweder als wahr oder falsch bewertet wird. Wenn True, wird der Dateiname ausgedruckt. Wenn nicht, wird der Befehl fortgesetzt.
-exec
= Dieses Flag ist eine Option innerhalb des Befehls find, mit der wir das Ergebnis eines anderen Befehls als Suchausdruck verwenden können. Es ist wie das Aufrufen einer Funktion innerhalb einer Funktion.
file {}
= der Befehl, der innerhalb von aufgerufen wird find
. Der file
Befehl gibt eine Zeichenfolge zurück, die den Dateityp einer Datei angibt. Regelmäßig würde es so aussehen : file mytextfile.txt
. In unserem Fall möchten wir, dass die Datei verwendet wird, die vom find
Befehl angezeigt wird. Daher setzen wir die geschweiften Klammern ein {}
, um als leere Variable oder Parameter zu fungieren. Mit anderen Worten, wir fordern das System lediglich auf, für jede Datei im Verzeichnis eine Zeichenfolge auszugeben.
";"
= Dies wird von find
und ist das Interpunktionszeichen am Ende unseres -exec
Befehls. Weitere Informationen finden Sie im Handbuch für 'Suchen', wenn Sie es benötigen, indem Sie es ausführen man find
.
| grep 'ASCII'
= |
ist eine Pfeife. Pipe nimmt die Ausgabe von allem, was links ist, und verwendet sie als Eingabe für alles, was rechts ist. Es nimmt die Ausgabe des find
Befehls (eine Zeichenfolge, die der Dateityp einer einzelnen Datei ist) und testet sie, um festzustellen, ob sie die Zeichenfolge enthält 'ASCII'
. Wenn dies der Fall ist, wird true zurückgegeben.
JETZT gibt der Ausdruck rechts von find ./
true zurück, wenn der grep
Befehl true zurückgibt. Voila.
find . -type f -exec grep -Il "" {} \;
.