Ich versuche, alle Dateien in einem Unterverzeichnis zu einer neuen Datei zu kombinieren und der neuen kombinierten Datei den gleichen Namen wie dem Unterverzeichnis zu geben. Ich habe keine Ahnung, wie dies in Bash geschehen soll. Hier ist, wie ich es angegangen bin: Ich habe eine Reihe von Verzeichnissen, jedes mit einem eindeutigen Dateinamen (mit Leerzeichen!). In jedem dieser Verzeichnisse gibt es eine Reihe von Dateien mit numerischen Namen, wie zum Beispiel:
Home/Unique name/1.pdf
Home/Unique name/2.pdf
Home/Unique name/3.pdf
Home/Unique name/4.pdf
....
Home/Other Unique name/1.pdf
Home/Other Unique name/2.pdf
Home/Other Unique name/3.pdf
Home/Other Unique name/4.pdf
Was ich tun möchte, ist ein Bash-Skript (aus dem Home
Verzeichnis) zu schreiben :
- Gehen Sie in jedes eindeutige Verzeichnis und führen Sie einen Befehl für jede der Dateien in diesem Verzeichnis aus (in meinem Fall kopieren Sie sie alle in ein anderes Verzeichnis).
- Ich habe dann ein anderes Skript geschrieben
script.sh
, das einen anderen Befehl ausführt (in diesem Fall kombinieren Sie alle PDFs in einer einzigen Dateitemp.pdf
). Ich möchte dann diesetemp.pdf
Datei nach dem Verzeichnis umbenennenUnique name.pdf
(mit Leerzeichen). - Ich muss diesen Prozess für eine Reihe von Unterverzeichnissen folgen.
Ich habe versucht, eine Lösung mit einer Reihe von for-Schleifen, while-Schleifen und dem Befehl find zu finden, aber ich bin mit bash nicht vertraut genug, um komfortabel zu debuggen oder diese Variablen mit einem gewissen Maß an Sicherheit zu verwenden. Ich bin mir auch sicher, dass es eine effizientere Möglichkeit gibt, das zu tun, was ich tue, aber ich habe das Skript über einen bestimmten Zeitraum hinweg zusammengebastelt.
cat
in der richtigen Reihenfolge anzeigen und die Ergebnissecat
in eine neue Datei umleiten.Antworten:
Die POSIX-Methode ist zu verwenden
print . -type d ... | while read f; do
, aber wenn Sie nicht von 100% Portabilität besessen sind, würde ich mich nicht darum kümmern. Wenn Sie Bash 4+ undpdfunite
(standardmäßig auf meinem Ubuntu 13.04 installiert) haben, können Sie dies in zwei Zeilen tun:Beachten Sie, dass
shopt -s globstar
sich dies in einer separaten Zeile zum Rest befinden muss. Wird bei aktiviertem Globstar**
rekursiv auf alle Dateien und Verzeichnisse im aktuellen Verzeichnis erweitert. Da Dateien nicht/
in ihren Namen enthalten sein können,**/
werden nur die Verzeichnisse erweitert. Ich verwende./**/
in dem unwahrscheinlichen Fall, dass Ihre Verzeichnisse mit einem Bindestrich (-
) beginnen, da dies Probleme verursachen kann, da viele Programme alles, was mit einem beginnt,-
als Option behandeln.Wie geschrieben, werden die PDFs nicht in ein anderes Verzeichnis kopiert, aber das ist ziemlich trivial hinzuzufügen:
Wenn Sie Ihr eigenes benutzerdefiniertes PDF-Kombinationsskript verwenden möchten, ändern Sie einfach die Zeile entsprechend. Beachten Sie jedoch, dass beim Erstellen von Shell-Skripten bereits vorhandene Befehle zusammengestellt werden.
Hier ist eine etwas portablere Version:
quelle
for
Schleife mitfind /home/ -type f -name "*.pdf"
als VariableVeröffentlichen Sie Ihr Skript und wir können Ihnen helfen, es zu verbessern.
Sie können Skripts immer mit ausführen
bash -x
, um sie zu debuggen, oder Sie können festlegen!#/bin/bash -x
, dass sie immer im Debug-Modus (ausführlich) ausgeführt werden.quelle