Shell-Scripting: Durchlaufen von Verzeichnissen und Verschieben / Umbenennen von Dateien

2

(Zu Ihrer Information, ich habe sehr wenig Wissen über Shell-Scripting)

Ich habe eine Menge Dateien und Verzeichnisse, die so aussehen

-root
 -dir1/a.txt
 -dir2/a.txt
 -dir3/b.txt
 -dir4/b.txt
 -dir5/c.txt

Ich möchte / concat alle Dateien mit denselben Dateinamen zusammenfassen und dann alles in das Stammverzeichnis einfügen. Das Endergebnis würde also aussehen

-root/a.txt (combined from dir1 and dir2)
-root/b.txt (combined from dir3 and dir4)
-root/c.txt

Wenn das nicht möglich ist, würde ich sogar damit zufrieden sein, alle Dateien in das Stammverzeichnis zu verschieben und eine Stapelumbenennung durchzuführen. So etwas wie

-root/a.txt.1
-root/a.txt.2
-root/b.txt.1
-root/b.txt.2
-root/c.txt.1

Hoffe das macht Sinn und danke schonmal :)

Kar
quelle

Antworten:

0

Wenn Sie sie kombinieren möchten und die Dateinamen vorher bekannt sind, können Sie Folgendes versuchen:

for i in a b c d
do
find <root direcoty> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

Für jedes a, b, c und d suchen wir in allen Verzeichnissen nach den Dateien, die den Namen a.txt (b.txt ... d.txt) haben, und rufen die Dateinamen cat auf und leiten die Ausgabe an ein Verzeichnis Datei mit demselben Namen unter dem Stammverzeichnis.

Wenn sie nicht vorher bekannt sind, wird es ein bisschen schwierig, aber hier:

for i in `find <root directory> -type f | sed -E 's!\./.*/([a-zA-Z0-9]+)\.txt!\1!g'`
do
find <root directory> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

Es ist derselbe Befehl wie zuvor, außer wo wir unsere Liste erhalten. Wir erhalten zunächst eine Liste aller Dateien im Stammverzeichnis und entfernen dann alle Teile der Dateinamen, sodass nur der Dateiname (äh, Dateiname) enthalten ist (kein Verzeichnis und keine Erweiterung). Bitte beachten Sie, dass dies nur für Dateien funktioniert, bei denen Groß- und Kleinbuchstaben mit Zahlen als Namen, keine Bindestriche oder Unterstriche gemischt sind. Wenn du sie willst, dann ändere sie [a-zA-Z0-9] zu [a-zA-Z0-9-_].

Ändern Sie jede Instanz von <root directory> zum gewünschten Pfad.

Ammar Alammar
quelle
genial! das hat genau das gemacht, was ich wollte :) danke eine Million
Kar