Примеры работы с данными на локальной машине

Простое копирование фай

В принципе, команда ср отлично выполняет свою функцию, за исключением небольшой прихоти – при копировании больших файлов хотелось бы знать сколько времени осталось до завершения операции (т.е. всего-навсего нужно вывести прогресс операции копирования). Данную задачу можно решить несколькими способами: 1) Использовать команду scp (потребует ввода пароля пользователя, а также ввода полного пути к каталогам):

scp -r <что копировать> localhost:<куда копировать>

2) Использовать команду rsync с ключом –progress:

rsync --progress -av <что копировать> <куда копировать>

При копировании каталогов (а не файлов) в последнем случае следует обратить внимание на знак "/" замыкающий имя каталога-источника, т.к. команда rsync будет интерпретировать результат по-разному:

rsync --progress -av <каталог-источник> <каталог-назначения/>
rsync --progress -av <каталог-источник/> <каталог-назначения/>

Наличие завершающих слешей "/" обязательно, иначе результат копирования будет содержать корневую папку <каталог-источник> внутри <каталога-назначения>.

Копирование файла а из dir1 в dir2:

scp /home/dir1/a localhost:/home/dir2/

Копирование каталога из dir1 в dir2:

scp -r /home/dir1/ localhost:/home/dir2/

Копирование файла а из dir1 в dir2:

rsync --progress -av ~/dir1/a ~/dir2/

Копирование файлов из dir1 в dir2:

rsync --progress -av ~/dir1/ ~/dir2/

Копирование самой директории dir1 (со всем содержимым) в dir2:

rsync --progress -av ~/dir1 ~/dir2/

Синхронизация каталогов

Точная копия каталогов (удаление всех файлов из dir2, которых нет в dir1):

rsync --delete -av ~/dir1/ ~/dir2/

Исключить каталоги, синхронизация которых не требуется (например, каталог dir3 находящийся в dir1 при копировании последнего в dir2 будет пропущен):

rsync -av ~/dir1/ --exclude="./~dir3/" ~/dir2/

Двусторонняя синхронизация (объединить содержимое dir1 и dir2)

rsync -av ~/dir1/ ~/dir2/ && rsync -av ~/dir2/ ~/dir1/

Работа с удаленной машиной

Скопировать полностью структуру фалов и папок из /home/data1/ в /home/other/data2/:

rsync -av /home/data1/ /home/other/data2/

Наличие завершающих слешей в /home/data1/ файла обязательно, иначе результат копирования будет содержать корневую папку data1/ в папке /home/other/data2/. Выполнить копирование на удалённую систему по ssh:

rsync -rvz /home/data1/ user@server.com:/home/data1/

Задать альтернативный порт ssh:

rsync -rvz -e 'ssh -p 10022' /home/data1/ user@server.com:/home/data1/

Исключить некоторые файлы:

rsync -rvz /home/data1/ --exclude="tmp/*" --exclude="*~" user@server.com:/home/data1/

Не учитывать пользователя, группу и права при передачи:

rsync -rvz --no-p --no-o --no-g /home/data1/ user@server.com:/home/data1/

Описание опций

$-a, --archive – архивный режим, включает рекурсивное копирование и сохранение прав и владельца (ключи rlptgoD)
$-t, --times – обновлять время модификации файла на приёмной стороне. При отсутствии этой опции или -a становиться неэффективной оптимизация передачи по времени изменения файлов
$-c, --checksum – использование сверки по контрольным суммам, а не по времени изменения и размеру
$--size-only – проверка только по размеру файлов
$-r – рекурсивный режим (копирование всех подпапок и файлов в них)
$-v – подробные вывод операций
$-z – компрессия данных при передачи
$-p – сохранять права
$--del – удалить файлы в папке назначения которых нет в источнике (точная копия)
$-R – использовать относительные пути при создании символических ссылок
$--numeric-ids – не транслировать имена владельца и группы в цифровые UID и GID, оставить на удалённой стороне номера как есть
$--size-only – использование для сверки только размер файлов
$--bwlimit=KBPS – ограничение пропускной способности, чтобы не забивать канал (Kbit/s)
$--ignore-errors – продолжать копирование и удаление после появления ошибок
$-h – вывод результатов с человеко-читаемом формате
$-A, --acls – сохранение списков ACL
$-H, --hard-links – сохранение жестких ссылок
$-S, --sparse – оптимизировать разреженные файлы
$-x, --one-file-system – не выходить за пределы текущей точки монтирования
$--exclude=