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 cp
vorhandene Dateien überschrieben werden, oder -i
um interaktiv abzufragen, ob Dateien überschrieben werden sollen.
Fragen
- Gibt es eine Möglichkeit, einen Fehler auszulösen
cp
und einen Fehlercode zurückzugeben, wenn die Datei bereits vorhanden ist? rsync
Wenn 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
. nohup
Es leitet /dev/null
zu weiter stdin
, sodass alle interaktiven Eingabeaufforderungen ignoriert werden, die Verwendung von wird jedoch stdin
als 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
nohup
erfolgt die Weiterleitungstdout
zunohup.out
undstderr
zustdout
. 2>nohup.out
fügt esstderr
ebenfalls in die Datei ein.- Das
&& rm || cat
wird bei Erfolg bereinigt odernohup.out
bei einem Fehler den Fehler ausgibt. Sie können anstelle von/einschließlich die gewünschte Fehlerbehandlung hinzufügencat
oder 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 stdin
zu umleiten, was als Status ungleich 0 cp
behandelt wird und diesen zurückgibt.n
$ cp -ia foo/* bar/ </dev/null
OSX
Unter OSX cp
verhält es sich überraschenderweise anders als unter BSD und gibt bei -n
einer übersprungenen Datei einen Status ungleich 0 zurück.
$ cp -n foo/* bar/