Ich habe eine andere Frage.
Ich habe drei verschiedene Verzeichnisse, aber darin befinden sich die gleichen Dateien mit dem gleichen Namen. Beispiel:
Verzeichnis1:
dir1/file1.txt
dir1/file2.txt
dir1/file3.txt
Verzeichnis2:
dir2/file1.txt
dir2/file2.txt
dir2/file3.txt
Verzeichnis3:
dir3/file1.txt
dir3/file2.txt
dir3/file3.txt
Ich möchte die Dateien mit dem gleichen Namen einfügen. Gefällt mir:
dir1/file1.txt
+ dir2/file1.txt
+ dir3/file1.txt
=file1.txt
dir1/file2.txt
+ dir2/file2.txt
+ dir3/file2.txt
=file2.txt
dir1/file3.txt
+ dir2/file3.txt
+ dir3/file3.txt
=file3.txt
Wie kann ich es tun?
Antwort1
Wenn Sie Dateiinhalte verketten möchten, können Sie dies tun
cat dir*/file1 > file1
cat dir*/file2 > file2
cat dir*/file3 > file3
Das Platzhalterzeichen veranlasst den Befehl „cat“, den Inhalt aller Verzeichnisse/Dateien zu lesen, die dem Muster entsprechen. Somit wird der Inhalt von Dateien mit demselben Namen in allen drei Verzeichnissen in die resultierende Datei geschrieben.
Antwort2
Angenommen, Sie kennen nur die Namen der Verzeichnisse, nicht aber die Namen der Dateien, könnten Sie die Dateinamen aus einem der Verzeichnisse in einem Array speichern und dann über die Elemente iterieren, wobei Sie den Verzeichnisnamen entfernen und den resultierenden Dateinamen aus jedem Verzeichnis einfügen:
files=(dir3/*)
for p in "${files[@]}"; do
f=${p#*/}; paste dir1/"$f" dir2/"$f" dir3/"$f" > "$f"; done
Beachten Sie, dass der Text kürzer gemacht werden könnte, wenn ein Glob verwendet würde, damit die Shell ihn erweitert (die Verzeichnisnamen würden dann in lexikografischer Reihenfolge verwendet), z. B.
for p in "${files[@]}"; do f=${p#*/}; paste dir*/"$f" > "$f"; done