Команда Linux cp: Мои самые используемые флаги и аргументы

Команда Linux cp: Мои самые используемые флаги и аргументы


Перейти по ссылкам

  • -r или -R: Рекурсивное копирование
  • -u: Копировать только если источник новее
  • -i: Интерактивный режим
  • -v: Подробный режим
  • -p: Сохранять атрибуты

Команда cp в Linux имеет несколько интересных опций, которые расширяют её возможности. Большинство пользователей просто копируют файлы обычным способом и никогда не исследуют доступные флаги. Попробовав несколько, я понял, что есть флаги, которые я постоянно использую для более удобной работы.

-r или -R: Рекурсивное копирование

Вы можете использовать команду cp для копирования как файлов, так и каталогов. По умолчанию она работает только с файлами. Если вы попытаетесь использовать её для каталогов, вы получите ошибку, и каталог не будет скопирован.

cp dirA/ dirB/

Вот где появляется флаг -r. Используя флаг -r, вы также можете копировать каталоги и файлы внутри них.

cp -r dirA/ dirB/

Здесь мы копируем всю директорию «dirA/» в другую директорию с названием «dirB/». Вы заметите, что сама директория «dirA/» также была скопирована. Если вы этого не хотите и хотите скопировать только содержимое внутри директории, то необходимо добавить точку (.) после слэша, вот так:

cp -r dirA/. dirB/

Если вы просто хотите создать копию в той же директории, вы можете вместо этого передать новое имя в качестве аргумента.

cp -r dirA/ dir-copy # copying the directory and renaming it

-u: Копировать только если источник новее

Один из наиболее недооценённых флагов для команды cp — это -u. Эта опция указывает cp копировать файл только в том случае, если исходный файл новее файла назначения или если файл назначения ещё не существует.

Представьте, что у вас есть каталог с проектными файлами, которые вы копируете в другую папку для резервного хранения. Каждый раз выполнение обычного рекурсивного копирования перезапишет все файлы, даже те, которые не изменились. Это пустая нагрузка на ввод-вывод и, в зависимости от размера проекта, может значительно замедлить работу.

С параметром -u вы можете выполнять ту же команду копирования снова и снова, и будут передаваться только обновленные файлы. Допустим, у вас есть папка «reports/», которую вы синхронизируете с папкой «backup/»:

cp -ru reports/ backup/

Как видно на скриншоте выше, я провёл небольшой эксперимент, который вы тоже можете повторить. Первый запуск скопирует всё. Второй запуск скопирует только файлы, которые вы изменили или создали с последнего резервного копирования. Если ничего не изменилось, команда завершится почти мгновенно.

-i: Интерактивный режим

Если вы забывчивы, как я, вы, вероятно, запускали команду cp, не подумав, нажимали Enter и вдруг осознавали, что только что перезаписали файл, который совсем не хотели терять. По умолчанию cp не спрашивает подтверждения. Он просто тихо заменяет файл назначения. Вот здесь и пригодится флаг -i. Он заставляет cp спрашивать перед перезаписью файла. Если файл назначения уже существует, cp предложит вам простой вопрос, например:

cp: overwrite 'file.txt'?

На этом этапе вы можете ввести ‘y’, чтобы перезаписать, или ‘n’, чтобы пропустить. Вот пример:

cp -i report1.txt reports/ # cp: overwrite 'reports/report1.txt'? n cp -i report1.txt reports/ # cp: overwrite 'reports/report1.txt'? y

Если «reports/report1.txt» уже существует, у вас спросят разрешение на его замену. Без параметра -i файл будет переписан без предупреждения. Это особенно полезно при копировании в такие места, как «/etc/» или «/var/», где неправильная замена может вызвать серьезные проблемы. Если вы хотите скопировать множество файлов, и некоторые уже существуют в целевой папке, параметр -i позволяет принимать решение для каждого случая отдельно.

-v: Подробный режим

Флаг -v довольно часто используется в командах Linux. Он включает режим подробного вывода, что полезно для того, чтобы видеть, что происходит в фоновом режиме при выполнении команды. В частности, для команды cp флаг -v показывает, что именно копируется. С -v каждый файл, который копируется, выводится в терминал в формате:

'source' -> 'destination'

Это делает абсолютно ясным, что происходит за кулисами. Давайте рассмотрим пример:

cp -v report1.txt backup/

Для нескольких файлов вы можете использовать подстановочный знак:

cp -v *.txt backup/

Теперь у вас есть подтверждение того, что каждый файл действительно оказался там, куда вы ожидали. При копировании файлов пакетами флаг подробного вывода предоставляет текущий журнал прогресса. Он также полезен для выявления небольших ошибок в случае неудачного копирования.

-p: Сохранять атрибуты

По умолчанию команда cp сосредоточена на передаче содержимого ваших файлов из точки А в точку Б. Но иногда метаданные, такие как отметки времени, режимы файлов и владельцы, так же важны, как и сам файл. Именно для этого используется флаг -p: для сохранения атрибутов.

Когда вы добавляете -p, команда cp сохраняет эти атрибуты. Без -p скопированные файлы получают новые временные метки и стандартные права собственности в месте назначения. С -p они остаются «клонами» оригиналов как по содержимому, так и по метаданным. Давайте посмотрим это на практике.

cp -p config.cfg backup/

В случае рекурсивного копирования:

cp -rp project/ backup/

Это скопирует всю директорию project/, обеспечивая сохранение всех исходных атрибутов файлов. Если вы архивируете файлы, вы не хотите, чтобы у всех отображалась сегодняшняя дата. Сохранение оригинальных временных меток помогает узнать, когда на самом деле происходили изменения.


Существует гораздо больше флагов и аргументов для команды cp. Вы можете изучить их в официальной справке (manpage). Знание этих опций команд делает навигацию по файлам в Linux и управление ими из терминала гораздо проще.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *