Ich habe etwas ziemlich Einfaches, das ich tun möchte. Ich möchte in montage
einem Verzeichnis verwenden, das Tausende von Bildern enthält, mit sehr wenigen Optionen, nämlich:
me@home$ montage -size 256x256 DSC01*.JPG.svg output.png
... aber das ist einfach nicht gut genug, da es nur ungefähr 100 Bilder gleichzeitig erfasst; auch nicht
me@home$ montage -size 256x256 *.svg output.png
... wodurch alle Bilder gleichzeitig erfasst werden, da die resultierende Datei zu groß ist, um sie zu analysieren.
Was ich tun möchte, ist, ungefähr 100-200 Dateien gleichzeitig zu durchlaufen. Ich denke, dies könnte mit einer for-Schleife (?) Implementiert werden, aber ich bin nur ein bisschen verwirrt darüber, wie das geht. Ich denke, es gibt wahrscheinlich eine clevere Art zu verwenden find -exec
oder an xargs
die ich nicht denke. Ich benutze bash
, aber ich benutze zsh
gelegentlich.
Abschließend suche ich nach einem Einzeiler, der bei 2600 Bilddateien die Montage etwa 13 oder 26 Mal (einmal für jeweils 100-200 Dateien) aufruft und bei n Dateien ein Vielfaches von n Mal aufgerufen werden kann .
quelle
DSC0100.JPG.svg
...DSC2600.JPG.svg
?Antworten:
Eine
bash
Methode, die spezielle Array-Funktionen verwendet. wahrscheinlichzsh
mit einigen Modifikationen übersetzbar:quelle
Sie können dafür xargs verwenden; Leider ist es nicht möglich, -I (zum Eingeben in die Mitte einer Befehlszeile) und -L (zum Begrenzen der Anzahl von Dateien für einen einzelnen Aufruf der ausführbaren Datei) zu kombinieren. Daher habe ich diese Befehlszeile als Beispiel erstellt (aber Vorsicht vor Sonderzeichen in Dateinamen, sie werden nicht unterstützt):
Entfernen Sie das,
echo
wenn Sie den Befehl wirklich ausführen möchten.Vorsichtsmaßnahmen:
Aktualisieren:
Dies ist die entsprechende for-Schleife, die (wie ich hoffe) das Problem mit Leerzeichen in Dateinamen löst:
Update 2: Eine Python-Lösung, die gegen Sonderzeichen in Dateinamen immun sein sollte
quelle
ls
in einer Pipe die Ausgabe zu analysieren, sollten Sie auch vor den vielen Gefahren warnen, die damit verbunden sind , und zu Beginn sicherstellen, dass die Leute sie sehen.*.svg
(weshalb ich einen Kommentar zu der gestellten Frage gepostet habe). Im allgemeinsten Fall, in dem Sie alle Dateinamen verarbeiten müssen, müssen Sie auf Shell-Globbing und Arrays oderfind -print0 | xargs -0
Konstrukte zurückgreifen . Siehe meine Antwort für ein Beispiel des ersteren.Hier ist eine Version mit xargs, die für jeden Dateinamen sicher ist, jedoch eine temporäre Datei zum Speichern der Anzahl benötigt. Passen Sie '-n 100' an, um die Anzahl der Dateien pro Montage anzupassen. Sie können "printf" auch gegen "find -print0" austauschen, stellen Sie jedoch sicher, dass "count.temp" nicht gefunden wird.
quelle
Mit GNU Parallel können Sie Folgendes tun:
Es ist natürlich sicher für Dateien mit Sonderzeichen (wie Sie es normalerweise von GNU Parallel erwarten können).
Minimale Installation
Wenn Sie nur parallel benötigen und 'make' nicht installiert haben (möglicherweise ist das System alt oder Microsoft Windows):
Sehen Sie sich das Intro-Video für eine kurze Einführung an: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 oder unter http://tinyogg.com/watch/TORaR/ und http://tinyogg.com/watch/hfxKj /.
quelle