Verzeichnis kopieren, aber fehlschlagen, wenn die Datei am Ziel bereits vorhanden ist

Verzeichnis kopieren, aber fehlschlagen, wenn die Datei am Ziel bereits vorhanden ist

cp -a foo/* bar/kopiert den Inhalt von foo in bar und ersetzt dabei alle bereits vorhandenen Dateien. Ich kann das Flag -n verwenden, um zu verhindern, dass cpvorhandene Dateien überschrieben werden, oder -ium interaktiv abzufragen, ob Dateien überschrieben werden sollen.

Fragen

  • Gibt es eine Möglichkeit, einen Fehler auszulösen cpund einen Fehlercode zurückzugeben, wenn die Datei bereits vorhanden ist?
  • rsyncWenn nicht, ist dies mit oder einem anderen gängigen Werkzeug möglich ?

Antwort1

Linux

Es kann zu einem Fehler kommen, wenn unter Linux eine Datei vorhanden ist. Dies kann durch einen kleinen Hack mit GNU geschehen nohup. nohupEs leitet /dev/nullzu weiter stdin, sodass alle interaktiven Eingabeaufforderungen ignoriert werden, die Verwendung von wird jedoch stdinals Fehler behandelt.

$ nohup cp -ia foo/* bar/

Um ein wenig aufzuräumen:

$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
  • Standardmäßig nohuperfolgt die Weiterleitung stdoutzu nohup.outund stderrzu stdout.
  • 2>nohup.outfügt es stderrebenfalls in die Datei ein.
  • Das && rm || catwird bei Erfolg bereinigt oder nohup.outbei einem Fehler den Fehler ausgibt. Sie können anstelle von/einschließlich die gewünschte Fehlerbehandlung hinzufügen catoder alles davon entfernen und $?wie gewohnt vorgehen.
  • Sie müssen beim Speicherort der temporären Datei etwas schlauer sein, wenn Sie dies ernsthaft verwenden ( mktemp -d)

BSD

Unter BSD können Sie stdinzu umleiten, was als Status ungleich 0 cpbehandelt wird und diesen zurückgibt.n

$ cp -ia foo/* bar/ </dev/null

OSX

Unter OSX cpverhält es sich überraschenderweise anders als unter BSD und gibt bei -neiner übersprungenen Datei einen Status ungleich 0 zurück.

$ cp -n foo/* bar/

verwandte Informationen