
Ich möchte eine Datenbank mit psql
einem COPY
Befehl sichern. Hier ist mein Skript:
psql "user=${USERNAME} host=${HOSTNAME} dbname=${DBNAME} password=${PASSWORD}" -c \
"COPY (SELECT * FROM tbl) ORDER BY id ASC) TO STDOUT WITH CSV HEADER;" | \
bzip2 -z -f --best -c > /home/${DBNAME}-${FILENAME}.csv.bz2
Außerdem möchte ich wissen, wie viele Zeilen aus der Datenbank kopiert werden, aber psql hat diese Funktion nicht. Ich brauche also einen externen Befehl. Ich brauche so etwas wie das hier:
psql ... | wc -l | bzip2
Gibt es eine Lösung? Die einzige Lösung, die ich gefunden habe, ist die Verwendung von FIFO:
mkfifo /home/backup.fifo
psql ... | tee /home/backup.fifo | bzip2
Jetzt kann ich von einem anderen Terminalfenster aus Folgendes verwenden wc
:
wc -l /home/backup.fifo
Antwort1
Beide bash
und zsh
haben eine >(pipeline)
Funktion:
psql ... | tee >(wc -l) | bzip2
Beachten Sie, dass es sich >
hier nicht um eine normale Umleitung handelt, sondern um einen notwendigen Teil der Syntax. Sie benötigen ein zweites, >
wenn Sie es mit einer tatsächlichen Umleitung kombinieren möchten (mit einem Leerzeichen dazwischen, damit es nicht als >>
Umleitung zum Anhängen gelesen wird).