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

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

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

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

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

8
задан 19 June 2017 в 23:10

3 ответа

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

копия только, когда ИСХОДНЫЙ ФАЙЛ является более новым, чем целевой файл или когда целевой файл пропускает

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

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

Пример:

rsync --ignore-existing source/* destination/
13
ответ дан 23 November 2019 в 05:27

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

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

ключ здесь - то, что мы называем оболочку с определенными командами и передаем найденный файл как $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"
3
ответ дан 23 November 2019 в 05:27

Читайте man cp и используйте --no-clobber опция к cp.

0
ответ дан 23 November 2019 в 05:27

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

Похожие вопросы: