Копировать каждый файл в структуре каталогов по определенному пути, только если файл там уже не существует
Хотелось бы скопировать каждый файл из структуры каталогов в определенный каталог, только если файл там еще не существует.
Получил первую часть из этого вопроса переполнения стека:
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"