GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Finden und kopieren Sie alle Bilder im Verzeichnis mit Terminal Linux Mint und versuchen Sie, die Syntax zu verstehen

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


Linux
  1. Wie lösche ich ein Verzeichnis und einen Ordner in Linux?

  2. Verwenden von Sed-, Ex- und Perl-Befehlen zum Suchen und Ersetzen eines Textes in Linux

  3. Linux Alle Symlinks in Bezug auf ein Verzeichnis finden und entfernen?

  4. Suchen und kopieren Sie die Datei mit Bash

  5. Wie kopiere ich mit dem cp-Befehl in der Linux-Shell ein ganzes Verzeichnis in ein anderes Verzeichnis?

Alles über Tar-Dateien und wie man Dateien in Linux mit Terminal tart und enttarnt

So finden Sie ein gespeichertes WLAN-Passwort in Linux Mint mithilfe der GUI oder des Terminals

Tutorial zur Verwendung des letzten Befehls im Linux-Terminal

50 einfache und nützliche Beispiele für den Find-Befehl in Linux

Der Linux-Befehl zum Suchen des Verzeichnisses:Erklärt

Cut auf Linux Terminal verwenden