Beispiel: In meinem /temp-Verzeichnis habe ich 100 Dateien, 50 mit der Erweiterung .msg und 50 mit .xml.
/temp/test1.xml
/temp/test2.xml
/temp/test3.xml
.........
/temp/test49.xml
/temp/test50.xml
Und
/temp/test1.msg
/temp/test2.msg
/temp/test3.msg
.........
/temp/test49.msg
/temp/test50.msg
In einer Textdatei möchte ich eine Kombination der Inhalte der .xml- und .msg-Dateien nacheinander ausgeben. Die Ausgabedatei soll beispielsweise so aussehen:
content of test1.xml
content of test1.msg
content of test2.xml
content of test2.msg
content of test3.xml
content of test3.msg
............
content of test49.xml
content of test49.msg
content of test50.xml
content of test50.msg
in diesem /temp-Verzeichnis wird es immer eine gleiche Anzahl von .msg- und .xml-Dateien geben. Wird es zusätzlich möglich sein, den Pfad oder den Dateinamen vor dem Inhalt in der Ausgabedatei anzuzeigen? Beispiel:
text1.xml: content of test1.xml
text1.msg: content of test1.msg
text2.xml: content of test2.xml
text2.msg: content of test2.msg
text3.xml: content of test3.xml
text3.msg: content of test3.msg
....................
text49.xml: content of test49.xml
text49.msg: content of test49.msg
text50.xml: content of test50.xml
text50.msg: content of test50.msg
Ich habe versucht, eine einfache Pipe zu Datei
cat * > text.txt
Dies führt jedoch nicht zum gewünschten Ergebnis. In der Ausgabedatei wird zuerst der Inhalt aller *.xml-Dateien und dann der *.msg-Dateien aufgelistet.
Bitte helfen.
Antwort1
for f in *xml ; do
cat "$f" "${f/.xml/.msg}"
done > OUTPUTFILE
Könnte für Sie funktionieren, wenn Sie die Shell verwenden bash
. Andernfalls (andere POSIX-Shells) verwenden Sie: cat "$f" "${f%.xml}.msg"
anstelle der obigen cat
Zeile.
Antwort2
In solchen Situationen ist es oft sinnvoll, wie folgt vorzugehen:
Listen Sie alle Dateien in einer Textdatei auf:
$ ls > files
Bearbeiten Sie die Textdatei, um unerwünschte Dateien zu entfernen und die verbleibenden Dateien in der gewünschten Reihenfolge anzuordnen.
Führen Sie dann einfach Folgendes aus (vorausgesetzt, der Name der Dateien enthält keine Leerzeichen oder Sonderzeichen):
$ cat $(cat files) > bigfile
Eine Variante dieses Ansatzes besteht darin, die Textdatei in einen großen Befehl umzuwandeln.
file1
file2
file with spaces 3
...
filen
Zu:
cat \
file1 \
file2 \
"file with spaces 3" \
... \
filen \
> bigfile
Dann stellen Sie die Datei einfach als Skript bereit:
$ . ./files
vi
Mit können zu jeder Zeile im Puffer ein Leerzeichen und ein Backslash hinzugefügt werden :%s/$/ \\/
.
Antwort3
for i in {1..50}; do
echo "text$i.xml: `cat text$i.xml`" >> output.txt
echo "text$i.msg: `cat text$i.msg`" >> output.txt
done
Antwort4
Wenn es eine normale Sequenz ist, können Sie Folgendes tun:
in bash:
for ITER in {1..50}
do
cat test${ITER}.xml
cat test${ITER}.msg
done > test.txt
oder wenn Sie das Dienstprogrammseq
for ITER in $(seq 1 50)
do
cat test${ITER}.xml
cat test${ITER}.msg
done > test.txt