Копирование каталога, но сбой, если файл уже существует в месте назначения

Копирование каталога, но сбой, если файл уже существует в месте назначения

cp -a foo/* bar/скопирует содержимое foo в bar, заменив все файлы, которые уже существуют. Я могу использовать флаг -n, чтобы cpне перезаписывать существующие файлы или -iчтобы он интерактивно спрашивал, перезаписывать ли файлы.

Вопросы

  • Есть ли способ сделать так, чтобы файл завершился cpнеудачей и возвращал код ошибки, если он уже существует?
  • Если нет, то можно ли обойтись без него rsyncили каким-то другим распространенным инструментом?

решение1

Линукс

Если файл существует в Linux, возможна ошибка, если использовать небольшой хак с GNU nohup. nohupперенаправляет /dev/nullна stdin, поэтому любые интерактивные запросы игнорируются, но рассматривает использование stdinкак ошибку.

$ nohup cp -ia foo/* bar/

Чтобы немного прибраться:

$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
  • По умолчанию nohupперенаправляет stdoutна nohup.outи stderrна stdout.
  • 2>nohup.outstderrтакже помещает в файл.
  • Будет && rm || catвыполнена очистка при успешном выполнении или вывод ошибки nohup.outпри ошибке. Вы можете добавить любую обработку ошибок, которую хотите, вместо/включая catили удалить все это и работать $?как обычно.
  • Вам придется быть немного умнее в отношении расположения временных файлов, если вы используете это всерьез ( mktemp -d)

БСД

В BSD вы можете перенаправить stdinна , cpкоторый будет рассматриваться как nи вернет статус, отличный от 0.

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

OSX

На OSX cpведет себя, как ни странно, не так, как на BSD, и возвращает ненулевой статус при -nпропущенном файле.

$ cp -n foo/* bar/

Связанный контент