löschen Finde und kopiere alle Bilder im Verzeichnis mit terminal linux mint, versuche die Syntax zu verstehen




linux datei umbenennen (3)

OS Linux Mint

Wie der Titel sagt, möchte ich endlich alle Bilder in einem Verzeichnis finden und kopieren.

Ich fand:

finde alle jpg (oder JPG) Dateien im Verzeichnis und kopiere sie in den Ordner / home / joachim / neu2:

find . -iname \*.jpg -print0 | xargs -I{} -0 cp -v {} /home/joachim/neu2

und

Finde alle Bilddateien in directotry:

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' 

Mein Problem ist in erster Linie, ich verstehe die Syntax nicht wirklich. Kann jemand den Code erklären?

Und zweitens kann jemand die zwei Codes verbinden, um einen Code zu erzeugen, der das macht, was ich will;)

Grüße und Danke im Voraus!

Und wieder wäre eine Erklärung des Codes sehr hilfreich.


Answer #1

Die obige Antwort ist wirklich gut. aber es könnte länger dauern, wenn es ein riesiges Verzeichnis ist. Hier ist eine kürzere Version davon, wenn Sie Ihre Dateierweiterung bereits kennen

 find . -name \*.jpg | cut -d':' -f1 | xargs -I{} cp --parents -v {} ~/testimage/

Answer #2

Ich habe einen Befehl gefunden, der nur awk verwendet, der auch den Job erledigt:

find . -name '*' -exec file {} \; | 
awk '{
    if ($3=="image"){
        print substr($1, 0, length($1)-1);
        system("cp " substr($1, 0, length($1)-1) " /home/joachim/neu2" )
    }   
}'

der Teilstr ($ 1, 0, length ($ 1) -1) wird benötigt, weil in der ersten Spalte die Datei name zurückgibt;


Answer #3

Zuerst verstehst du, dass das Rohr "|" verbindet Befehle, die den Ausgang des ersten in den zweiten als Argument leiten. Ihre beiden Shell-Codes leiten die Ausgabe des Suchbefehls in andere Befehle (grep und xargs). Schauen wir uns diese Befehle nacheinander an:

Erster Befehl: finden

find ist ein Programm zum "Suchen nach Dateien in einer Verzeichnishierarchie" (das ist die Erklärung von 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 alle Unterverzeichnisse (die Verzeichnishierarchie) durchsucht werden.

Das Suchmuster akzeptiert Optionen -name (dh es sucht nach Dateien, deren Name mit dem Muster übereinstimmt, das als Argument für diese Option angegeben wurde) oder -iname (wie Name, aber Groß- und Kleinschreibung) und andere.

Das Aktionsmuster kann -print0 sein (den genauen Dateinamen einschließlich seiner Position im angegebenen Suchverzeichnis ausgeben, dh den relativen oder absoluten Pfad zu der Datei) oder -exec (führe den angegebenen Befehl für die Datei (en) aus, der Befehl lautet to mit ";" beendet werden und jede Instanz 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 Teil (erster Teil)

find . -name '*' -exec file {} \; 

findet alle Dateien in der aktuellen Verzeichnishierarchie und führt sie aus

file <filename>

auf sie. Datei ist ein weiterer Befehl, der den Dateityp bestimmt und ausgibt (siehe Manpage für Details, Man-Datei).

Zweiter Befehl: xargs

xargs ist ein Befehl, der Befehlszeilen aus Standardeingaben (man xargs) erstellt und ausführt, dh aus der find-Ausgabe, die in xargs piped ist. Der Befehl, den er erstellt und ausführt, ist in diesem Fall

cp -v {} /home/joachim/neu2"

Option -I {} definiert die Ersetzungszeichenfolge, dh jede Instanz von {} im Befehl soll durch die Eingabe ersetzt werden, die sie aus der Datei erhält (d. H. Die Dateinamen). Option -0 definiert, dass Eingabeelemente nicht durch Whitespace oder Zeilenumbrüche getrennt (sondern nur durch ein Nullzeichen getrennt) werden. Dies scheint notwendig zu sein, wenn man den Standard-Weg benutzt, um die Ausgabe als xargs-Eingabe zu finden.

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 Zeichenfolgen aus, die einem bestimmten Ausgabemuster entsprechen. Option -o weist grep an, nur die übereinstimmende Zeichenkette zu drucken, nicht die gesamte Zeile (siehe man grep), -P gibt ihr die Anweisung, das folgende Muster als Perl-Regexp-Muster zu interpretieren. In Perl regex ist ^ der Anfang der Zeile,. + Ist eine beliebige Zeichenkette, diesem Willkürlichen folgt dann ein Doppelpunkt, ein Leerzeichen, eine Anzahl von alphanumerischen Zeichen (in Perl regex bezeichnet mit \ w +) ein Leerzeichen und die Zeichenkette "Bild". Im Wesentlichen filtert dieser Befehl grep die Dateiausgabe, um nur die Dateinamen auszugeben, die Bilddateien sind. (Lies über Perl Regex zum Beispiel hier: http://www.comp.leeds.ac.uk/Perl/matching.html )

Der Befehl, den Sie eigentlich wollten

Nun wollen Sie (1) die Ausgabe des zweiten Shell-Befehls (der die Bilddateien auflistet) übernehmen, (2) ihn in die entsprechende Form bringen und (3) ihn vom ersten Shell-Befehl in den Befehl xargs leiten Zeile (die dann den gewünschten Kopierbefehl erstellt und ausführt). Also diesmal haben wir einen Shell-Befehl mit drei (eigentlich vier) Ebenen mit zwei Pipes. Kein Problem. Wir haben bereits Stufen (1) und (3) (obwohl in Stufe (3) die Option -0 weggelassen werden muss, weil die Eingabe keine Ausgabe mehr findet; wir brauchen sie, um Zeilenumbrüche als Elementtrennzeichen zu behandeln).

Stufe (2) fehlt noch. Ich schlage vor, den Befehl cut dafür zu verwenden. cut ändert strings py und teilt sie in verschiedene Felder auf (getrennt durch ein Trennzeichen in der ursprünglichen Zeichenkette), 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 nur das erste Feld geben soll (Option -f1, essentialls: nur den Dateinamen drucken, nicht der Teil, der nach dem ":" kommt, also Stufe (2) wäre dann

cut -d':' -f1

Und der gesamte Befehl, den du haben wolltest, ist 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 Man-Seiten zum Beispiel hier finden können: http://www.linuxmanpages.com





mint