finden und kopieren Sie alle Bilder im Verzeichnis mit terminal-linux mint, versuchen zu verstehen, syntax
OS Linux Mint
Wie der Titel sagt schließlich würde ich mag zu finden, und kopieren Sie alle Bilder in einem Verzeichnis.
Fand ich:
finden Sie alle jpg (oder JPG) Dateien in einem Verzeichnis und kopieren Sie Sie in den Ordner /home/joachim/neu2:
find . -iname \*.jpg -print0 | xargs -I{} -0 cp -v {} /home/joachim/neu2
und
finden alle Bilddateien in einem Verzeichnis:
find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image'
Mein problem ist zunächst einmal, verstehe ich nicht wirklich die syntax. Könnte das jemand erklären der code?
Und zweitens kann jemand eine Verbindung der beiden codes für generieren Sie einen code, der tut was ich will 😉
Grüße und vielen Dank im Voraus!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst verstehen, dass die pipe "|" links-Befehle umleiten der Ausgabe von der ersten in die zweite als argument. Ihre zwei shell-codes sowohl Rohr Ausgabe des find-Befehls in anderen Kommandos (grep und xargs). Schauen wir uns die Befehle einer nach dem anderen:
Ersten Befehl: finden
finden, ein Programm zur "Suche nach Dateien in eine Verzeichnis-Hierarchie" (das ist die Erklärung von finden die man-Seite). Die syntax ist (in diesem Fall)
In beiden Fällen das such-Verzeichnis ist . (das ist das aktuelle Verzeichnis). Beachten Sie, dass es nicht nur die Suche im aktuellen Verzeichnis, sondern alle seine Unterverzeichnisse (die Verzeichnis-Hierarchie).
Dem Suchmuster akzeptiert Optionen -name (D. H. es sucht nach Dateien, deren Namen dem Muster entspricht, gegeben als argument für diese option) oder -iname (gleicher name, aber groß /Kleinschreibung beachten) unter anderem.
Das action-Muster kann -print0 (drucken Sie den genauen Dateinamen, einschließlich seiner position in dem Verzeichnis Suche, D. H. der relative oder absolute Pfad zu der Datei) oder exec (ausführen der gegebenen Befehl auf die Datei(en), der Befehl wird beendet werden mit ";" und jede Instanz von "{}" wird ersetzt durch den Dateinamen).
Ist, ist die erste shell-code (der erste Teil, Links der Leitung)
sucht in allen Dateien mit der Endung ".jpg" im aktuellen Verzeichnis-Hierarchie und druckt Ihre Pfade und Namen. Der zweite (Erster Teil)
findet alle Dateien im aktuellen directory-Hierarchie und führt
auf Sie. Die Datei ist mit einem anderen Befehl, der bestimmt, und druckt die Datei geben (haben Sie einen Blick auf die man-Seite für details, Mann-Datei).
Zweiten Befehl: xargs
xargs ist ein Befehl, der "baut und exectues Befehl Zeilen von der Standardeingabe" (man xargs), d.h. von der find-Ausgabe wird über eine Pipe in xargs. Der Befehl, der es erstellt und ausführt, ist in diesem Fall
Option -I{} definiert die Ersatz-Zeichenfolge, D. H. jede Instanz von {} in der command ersetzt werden durch den input erhält es aus der Datei (den Dateinamen). Option -0 definiert, dass die Eingabe-Elemente werden nicht beendet (getrennt) durch Leerzeichen oder Zeilenumbrüche, sondern nur durch ein null-Zeichen. Dies scheint notwendig zu sein, bei der Nutzung und der standard-Weg, um mit der find-Ausgabe als xargs-Eingang.
Den Befehl, gebaut und ausgeführt wird, dann ist natürlich der copy-Befehl mit der option-v (verbose) und kopiert jeweils den Dateinamen es bekommt von finden Sie zum Verzeichnis.
Dritten Befehl: grep
grep filtert seinen Eingang, die nur jene Zeilen oder Zeichenketten, die eine bestimmte Ausgabe Muster. Die Option -o sagt grep zum drucken nur den passenden string, nicht die gesamte Zeile ("man grep)- P sagt, Sie interpretieren Sie das folgende Muster als perl-regexp-pattern. In perl-regex, ^ ist der Anfang der Zeile, .+ ist jede beliebige Zeichenfolge, diese willkürliche, sollte dann gefolgt von einem Doppelpunkt, ein Leerzeichen, eine Reihe von alphanumerischen Zeichen (in perl regex bezeichnet \w+) ein Leerzeichen und die Zeichenfolge "Bild". Im wesentlichen ist dieser grep-Befehl filtert die Datei-Ausgabe nur Ausgabe der Dateinamen, sind image-Dateien. (Lesen Sie mehr über perl regex ' s zum Beispiel hier: http://www.comp.leeds.ac.uk/Perl/matching.html )
Den Befehl, den Sie eigentlich wollte
Nun, was Sie tun möchten ist, (1) nehmen Sie den Ausgang der zweiten shell-Befehl (listet die Bild-Dateien), (2) bringen Sie es in die entsprechende form und (3) Rohr in den xargs-Befehl aus der ersten shell-Kommando-Zeile (die dann erstellt und ausführt, den Befehl kopieren Sie wollte). Also wir haben diesmal drei (eigentlich vier) stage shell-Befehl mit zwei Leitungen. Kein problem. Wir haben bereits die Stufen (1) und (3) (obwohl in der Stufe (3) wir müssen aus den 0 option, weil der Eingang nicht finden-Ausgang mehr; wir brauchen es zur Behandlung von Zeilenumbrüchen als Element seperators).
Phase (2) noch fehlt. Ich schlage vor, mit der Ausschneiden-Befehl für diesen. cut verpasst strings py Aufspaltung in verschiedene Felder (getrennt durch ein Trennzeichen in der original-string), die dann neu geordnet werden. Wähle ich ":" als Trennzeichen (in diesem endet der Dateiname in der grep-Ausgabe, option -d':') und sagen, geben Sie uns einfach das erste Feld (option -f1, essentialls: drucken, wird nur der Dateiname, nicht der Teil nach dem ":"), D. H. der Stufe (2) wäre dann
Und der gesamte Befehl, den Sie wollte, dann:
Beachten Sie, dass Sie alle man-Seiten zum Beispiel hier: http://www.linuxmanpages.com
Dachte ich, einen Befehl, nur mit awk, das macht den job als gut:
den substr($1, 0, length($1)-1) ist erforderlich, da in der ersten Spalte der Datei gibt Namen;
Die obige Antwort ist wirklich gut. aber es könnte länger dauern, wenn es ein großes Verzeichnis.
hier ist eine kürzere version von es , wenn Sie bereits wissen, Ihre Datei-Erweiterung