Wie kann ich Dateien mit gleichem Namen aus verschiedenen Verzeichnissen einfügen?

Wie kann ich Dateien mit gleichem Namen aus verschiedenen Verzeichnissen einfügen?

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

verwandte Informationen