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

Представим следующую ситуацию. У меня есть папка Test, которая с определенной периодичностью наполняется данными:

И есть жесткий диск, флешка или другое устройство хранения данных:

Данные из этой папки необходимо копировать, то есть создавать резервную копию.

Команда cp -u

Сделать это можно при помощи команды cp. На сайте уже была статья про данную команду, которая предназначена для копирования файлов.

Для того, чтобы постоянно не копировать всю папку целиком был придуман ключ -u, который расшифровывается как update, то есть обновление. Он позволяет копировать только новые файлы, или те файлы, которые были изменены. Воспользуемся данной командой:

cp -ru test/ /media/deb/43162A467B118F76/

Команда cp, далее идет ключ -r, который позволяет рекурсивно копировать файлы, и ключ -u соответственно. Далее указывается откуда необходимо копировать в моем случае это папка test и через пробел куда копировать, где я прописал путь к жесткому диску.

Выведу содержимое жесткого диска:

ls /media/deb/43162A467B118F76/

И как можно увидеть папка test скопировалась:

Открою её в проводнике и всё скопировалось успешно:

Далее в папке test создам новую папку 2:

И в ней текстовый файл:

Теперь снова скопирую данные:

cp -ru test/ /media/deb/43162A467B118F76/

И как можно увидеть всё скопировалось успешно:

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

И снова выполню команду копирования:

cp -ru test/ /media/deb/43162A467B118F76/

Данный файл также обновился:

Теперь удалю папку 1:

И снова выполню команду копирования:

cp -ru test/ /media/deb/43162A467B118F76/

Соответственно на жестком диске папка 1 осталась без измененный:

Верну папку 1 и создам в ней новый текстовый файл:

Теперь снова выполню команду копирования:

cp -ru test/ /media/deb/43162A467B118F76/

И данный файл скопировался. При этом при использовании данной команды копировались только новые или обновленные файлы, а не все файлы целиком.

Команда rsync

Следующая команда это rsync.

Удалю из папки test всё лишнее и оставлю только папку 1. И при помощи rsync снова скопирую файлы:

rsync -av --progress test/ /mnt/8007586b-1af6-4e48/test

Здесь также сначала прописывается команда rsync, далее идут ключи -a и -v, далее идет ключ --progress, который выводит прогресс копирования, далее указывается папка откуда необходимо копировать и в конце указывается путь куда необходимо вставить. При этом, в отличие от команды cp в конце пути необходимо указать папку в которую нужно копировать. В моём случае это test.

Выполнив данную команду можно увидеть как ключ --progress показал то, что скопировалась папка 1 и файл 1.txt:

А также на жестком диске была создана папка test. Как можно увидеть всё скопировалось успешно:

При помощи ключа -v rsync отображает более подробную информацию. А ключ -a, что означает архив включать в себя множество ключей -rlptgoD, которые позволяют рекурсивно скопировать права на файлы и папки, символьные ссылки, а также время создания и изменения.

Создам папку 2 вместе с новым файлом:

И снова выполню команду копирования:

rsync -av --progress test/ /mnt/8007586b-1af6-4e48/test

В данном случае скопировалась папка 2 и файл 2.txt:

Теперь обновлю файл 1.txt и снова выполню команду:

Соответственно файл 1.txt обновился:

Теперь удалю папку 1 и снова выполню данную команду. В данном случае не были затронуты никакие файлы и папки:

На жестком диске также осталась папка 1.

Теперь верну папку 1 и создам новый файл:

Снова выполню команду и папка 1 и новый файл снова скопировались:

Отличия rsync и cp

Основным отличием rsync от cp является то, что rsync предоставляет более расширенную функциональность. В rsync можно использовать сжатие, шифрование, копировать файлы на удаленную машину, использовать ssh, FTP, также запускать его в фоновом режиме.