Verstehen Sie zunächst, dass die Pipe "|" links befiehlt, die Ausgabe der ersten als Argument an die zweite weiterzuleiten. Ihre beiden Shell-Codes leiten die Ausgabe des find-Befehls in andere Befehle (grep und xargs). Sehen wir uns diese Befehle nacheinander an:
Erster Befehl:Suchen
find ist ein Programm zum "Suchen nach Dateien in einer Verzeichnishierarchie" (das ist die Erklärung auf der man-Seite von find). Die Syntax ist (in diesem Fall)
find <search directory> <search pattern> <action>
In beiden Fällen ist das Suchverzeichnis . (das ist das aktuelle Verzeichnis). Beachten Sie, dass nicht nur das aktuelle Verzeichnis, sondern auch alle seine Unterverzeichnisse (die Verzeichnishierarchie) durchsucht werden.
Das Suchmuster akzeptiert unter anderem die Optionen -name (was bedeutet, dass es nach Dateien sucht, deren Name mit dem Muster übereinstimmt, das als Argument für diese Option angegeben wurde) oder -iname (dasselbe wie der Name, aber ohne Berücksichtigung der Groß-/Kleinschreibung).
Das Aktionsmuster kann -print0 (den genauen Dateinamen einschließlich seiner Position im angegebenen Suchverzeichnis ausgeben, d. h. den relativen oder absoluten Pfad zur Datei) oder -exec (den angegebenen Befehl auf die Datei(en) ausführen, der Befehl lautet) sein mit ";" enden und jedes Vorkommen von "{}" wird durch den Dateinamen ersetzt).
Das heißt, der erste Shell-Code (erster Teil, links von der Pipe)
find . -iname \*.jpg -print0
durchsucht alle Dateien mit der Endung „.jpg“ in der aktuellen Verzeichnishierarchie und gibt deren Pfade und Namen aus. Der zweite (erster Teil)
find . -name '*' -exec file {} \;
findet alle Dateien in der aktuellen Verzeichnishierarchie und führt aus
file <filename>
auf sie. File ist ein weiterer Befehl, der den Dateityp bestimmt und ausgibt (siehe Manpage für Details, man file).
Zweiter Befehl:xargs
xargs ist ein Befehl, der „Befehlszeilen aus der Standardeingabe erstellt und ausführt“ (man xargs), d. h. aus der find-Ausgabe, die in xargs geleitet wird. Der Befehl, den es erstellt und ausführt, ist in diesem Fall
cp -v {} /home/joachim/neu2"
Die Option -I{} definiert die Ersetzungszeichenfolge, d. h. jede Instanz von {} im Befehl muss durch die Eingabe ersetzt werden, die sie aus der Datei erhält (d. h. den Dateinamen). Die Option -0 definiert, dass Eingabeelemente nicht durch Leerzeichen oder Zeilenumbrüche, sondern nur durch ein Nullzeichen abgeschlossen (getrennt) werden. Dies scheint notwendig zu sein, wenn und die Standardmethode verwendet wird, um die Ausgabe von find als xargs-Eingabe zu behandeln.
Der Befehl, der erstellt und ausgeführt wird, ist dann natürlich der Kopierbefehl mit der Option -v (verbose) und kopiert jeden der Dateinamen, die er von find erhält, in das Verzeichnis.
Dritter Befehl:grep
grep filtert seine Eingabe und gibt nur die Zeilen oder Strings aus, die einem bestimmten Ausgabemuster entsprechen. Die Option -o weist grep an, nur den übereinstimmenden String auszugeben, nicht die gesamte Zeile (siehe man grep), -P weist es an, das folgende Muster als ein Perl-Regexp-Muster zu interpretieren. In Perl-Regex ist ^ der Anfang der Zeile, .+ ist eine beliebige Zeichenfolge, dieser beliebigen Zeichenfolge sollte dann ein Doppelpunkt, ein Leerzeichen, eine Anzahl alphanumerischer Zeichen (in Perl-Regex als \w+ bezeichnet), ein Leerzeichen und die Zeichenfolge folgen "Bild". Im Wesentlichen filtert dieser grep-Befehl die Dateiausgabe, um nur die Dateinamen auszugeben, die Bilddateien sind. (Lesen Sie zum Beispiel hier etwas über die regulären Ausdrücke von Perl:http://www.comp.leeds.ac.uk/Perl/matching.html )
Der eigentlich gewünschte Befehl
Was Sie jetzt tun möchten, ist (1) die Ausgabe des zweiten Shell-Befehls (der die Bilddateien auflistet) zu nehmen, (2) sie in die entsprechende Form zu bringen und (3) sie vom ersten Shell-Befehl in den xargs-Befehl zu leiten line (die dann den gewünschten Kopierbefehl erstellt und ausführt). Diesmal haben wir also einen dreistufigen (eigentlich vierstufigen) Shell-Befehl mit zwei Pipes. Kein Problem. Wir haben bereits die Stufen (1) und (3) (obwohl wir in Stufe (3) die Option -0 weglassen müssen, da die Eingabe keine Ausgabe mehr ist; wir brauchen sie, um Zeilenumbrüche als Elementtrennzeichen zu behandeln).
Stufe (2) fehlt noch. Ich schlage vor, dafür den cut-Befehl zu verwenden. cut ändert Zeichenfolgen, indem es sie in verschiedene Felder aufteilt (getrennt durch ein Trennzeichen in der ursprünglichen Zeichenfolge), die dann neu angeordnet werden können. Ich wähle ":" als Trennzeichen (dies beendet den Dateinamen in der grep-Ausgabe, Option -d':') und sage ihm, dass es uns nur das erste Feld geben soll (Option -f1, wesentlich:drucke nur den Dateinamen, nicht der Teil, der nach dem ":" kommt, also Stufe (2), wäre dann
cut -d':' -f1
Und der gesamte gewünschte Befehl lautet dann:
find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2
Beachten Sie, dass Sie alle Manpages zum Beispiel hier finden:http://www.linuxmanpages.com