Хотел бы скопировать каждый файл от структуры каталогов до определенного каталога, только если файл уже не существует там.
Получил первую часть от этого вопроса о Переполнении стека:
find . -type f -exec cp {} /target-directory \;
Как я могу проверить, существует ли файл или нет? В противном случае скопируйте файл, иначе пропустите.
Можно использовать -u
переключатель от cp
команда:
копия только, когда ИСХОДНЫЙ ФАЙЛ является более новым, чем целевой файл или когда целевой файл пропускает
или использует rsync
команда с --ignore-existing
:
файлы обновления пропуска, которые существуют на получателе
Пример:
rsync --ignore-existing source/* destination/
Ваша исходная команда может быть переписана как:
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"
Читайте man cp
и используйте --no-clobber
опция к cp
.