Копировать каждый файл в структуре каталогов по определенному пути, только если файл там уже не существует

Хотелось бы скопировать каждый файл из структуры каталогов в определенный каталог, только если файл там еще не существует.

Получил первую часть из этого вопроса переполнения стека:

find . -type f -exec cp {} /target-directory \;

Как я могу проверить, существует ли файл или нет? Если нет, скопируйте файл, иначе пропустите.

3 ответа

Решение

Ты можешь использовать -u переключиться с cp команда:

копировать только в том случае, если файл SOURCE новее, чем файл назначения, или когда файл назначения отсутствует

или использовать rsync команда с --ignore-existing:

пропустить обновление файлов, которые существуют на приемнике

Пример:

rsync --ignore-existing source/* destination/

Ваша оригинальная команда может быть переписана как:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

Ключевым моментом здесь является то, что мы вызываем shell с конкретными командами и передаем найденный файл как $1 аргумент. Если test -e /target-directory/"$1" терпит неудачу, это означает, что файл не существует, и в этом случае cp скопирует файл

В общем случае можно использовать другие команды, если команда может проверить существование файла. Некоторые из других альтернатив:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

Читать man cpи использовать --no-clobber возможность cp,

Другие вопросы по тегам