Centos копирование файла без подтверждения

Обновлено: 03.07.2024

В главе Глава 1. Базовые Концепции Системы UNIX вы увидели как запускать shell. В данной главе мы покажем вам как работать с ней.

Главная ценность shell это множество существующих утилит: их тысячи и каждая выполняет свою отдельную задачу. Мы рассмотрим только их небольшое число. Одно из величайших преимуществ UNIX это умение комбинировать эти утилиты, что мы увидим позже.

Утилиты Обработки Файлов

В данном контексте обработка файлов обозначает их копирование, перемещение и удаление. Позже мы рассмотрим способы изменения их атрибутов (владелец, права).

mkdir, touch: Создание Пустых Каталогов и Файлов

mkdir (MaKe DIRectory (создать каталог)) используется для создания каталогов. Ее синтаксис простой:

Только один параметр ничего не обозначает: -p . Он делает две вещи:

с ним команда будет создавать родительские каталоги, если они не существовали ранее. Без этого параметра mkdir просто может упасть, пожаловавшись, что упомянутые родительские каталоги не существуют;

Вот несколько примеров:

mkdir foo: создает каталог foo в текущем каталоге;

mkdir -p images/misc docs: создает каталог misc в каталоге images. Сначала она создаст последний, если он не существует (-p); также создаст каталог с именем docs в текущем каталоге.

Изначально, команда touch не предназначалась для создания файлов, а только для обновления доступа к файлу и изменения времени создания файла [3] . Однако, touch будет создавать пустые файлы, если их не существовало ранее. Синтаксис такой:

Итак, запуск команды:

создаст пустой файл с именем file1 в текущем каталоге и пустой файл file2 в каталоге images, если файлы еще не существовали до этого.

rm: Удаление Файлов и Каталогов

Команда rm (ReMove) заменяет команды DOS del и deltree, и имеет много дополнительных параметров . Ее синтаксис следующий:

-r, или -R: удаляет рекурсивно. Этот параметр обязательный для удаления каталогов, пустых или нет. Однако вы можете также использовать rmdir для удаления пустых каталогов.

-i: запросить подтверждение перед каждым удалением. Обратите внимание, что по умолчанию в Mandrake Linux , rm является alias (алиасом) команды rm -i, в целях безопасности (подобные алиасы есть для команд cp и mv). Вы можете изменить свое мнение относительно полезности этих алиасов. Если вы захотите удалить их, отредактируйте ваш файл

/.bashrc и добавьте строку: unalias rm cp mv.

-f, обратная опции -i, форсированное удаление файлов или каталогов даже если пользователь не имеет права на запись файлов. [4] .

rm -i images/*.jpg file1: удаляет все файлы с окончанием .jpg в названии в каталоге images и удаляет файл file1 в текущем каталоге с запросом подтверждения. Ответьте y чтобы подтвердить удаление, n чтобы отменить.

rm -Rf images/misc/ file*: удаляет без вопросов весь каталог misc/ в каталоге images/ вместе со всеми файлами в текущем каталоге, чьи имена начинаются с file.

Внимание

rm удаляет файлы безвозвратно . Не существует способа их восстановить! Не пренебрегайте использовать параметр -i, чтобы не удалить что-либо по ошибке.

mv: Перемещение или Переименование Файлов

Синтаксис команды mv (MoVe) следующий:

-i: напротив, спрашивает подтверждение у пользователя, перед тем как переписать существующий файл.

-v: verbose (подробный) режим, сообщает о всех изменениях или активности.

mv -i /tmp/pics/*.jpg .: переносит все файлы из каталога /tmp/pics/ с окончаниями в именах .jpg в текущий каталог (.), но спрашивает подтверждение, перед тем как переписать любой файл.

mv foo bar: переименовывает файл foo в bar. Если уже существует каталог bar, эффектом этой команды будет перенос всего каталога foo (самого каталога и всех его файлов и каталогов в нем рекурсивно) в каталог bar .

mv -vf file* images/ trash/: переносит без подтверждения все файлы текущего каталога, имена которых начинаются с file, вместе со всем каталогом images/ в каталог trash/, и показывает информацию о каждой операции.

cp: Копирование файлов и каталогов

cp (CoPy) замещает команды DOS copy и xcopy и имеет множество дополнительных параметров. Ее синтаксис:

cp имеет много параметров. Вот основные из них:

-R: рекурсивное копирование; обязательно для копирования каталогов, даже пустых.

-i: запрос подтверждения перед перезаписью любого файла, который может быть перезаписан.

-f: обратный -i, заменяет любой существующий файл без подтверждения.

-v: подробный (verbose) режим, отображает все действия, производимые cp.

cp -i /tmp/images/* images/: копирует все файлы в каталоге /tmp/images/ в каталог images/, расположенный в текущем каталоге. Запрашивает подтверждение, если файл должен быть перезаписан.

cp -vR docs/ /shared/mp3s/* mystuff/: копирует весь каталог docs плюс все файлы из каталога /shared/mp3s в каталог mystuff.

cp foo bar: делает копию файла foo с именем bar в текущем каталоге.

[3] В UNIX есть три различных временных метки для каждого файла: время последнего обращения к файлу (atime), то есть последний раз когда файл открывался на чтение или запись; последняя дата изменения атрибутов inode (mtime); и время, когда изменялось последний раз содержимое файла. (ctime).

[4] Для пользователя достаточно иметь права записи в каталоге, чтобы удалять файлы в нем, даже если он не владелец файлов, которые там лежат.

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

Допустим нам нужно скопировать всё из папки /source в папку /target.

Первое, что приходит на ум это:


Сразу исправим эту команду на:


Ключ -a добавит копирование всех аттрибутов, прав и добавит рекурсию. Когда не требуется точное воспроизведение прав достаточно ключа -r .

После копирования мы обнаружим, что скопировались не все файлы — были проигнорированы файлы начинающиеся с точки типа:

.profile
.local
.mc
и тому подобные.

Почему же так произошло?

Потому что wildcards обрабатывает shell ( bash в типовом случае). По умолчанию bash проигнорирует все файлы начинающиеся с точек, так как трактует их как скрытые. Чтобы избежать такого поведения нам придётся изменить поведение bash с помощью команды:


Чтобы это изменение поведения сохранилось после перезагрузки, можно сделать файл wildcard.sh c этой командой в папке /etc/profile.d (возможно в вашем дистрибутиве иная папка).

А если в директории-источнике нет файлов, то shell не сможет ничего подставить вместо звёздочки, и также копирование завершится с ошибкой. Против подобной ситуации есть опции failglob и nullglob . Нам потребуется выставить failglob , которая не даст команде выполниться. nullglob не подойдёт, так как она строку с wildcards не нашедшими совпадения преобразует в пустую строку (нулевой длины), что для cp вызовет ошибку.

Однако, если в папке тысячи файлов и больше, то от подхода с использованием wildcards стоит отказаться вовсе. Дело в том, что bash разворачивает wildcards в очень длинную командную строку наподобие:


На длину командной строки есть ограничение, которое мы можем узнать используя команду:


Получим максимальную длину командной строки в байтах:


Получим что-то типа:


Итак, давайте будем обходиться вовсе без wildcards.

Давайте просто напишем


И тут мы столкнёмся с неоднозначностью поведения cp . Если папки /target не существует, то мы получим то, что нам нужно.

Однако, если папка target существует, то файлы будут скопированы в папку /target/source.

Не всегда мы можем удалить заранее папку /target, так как в ней могут быть нужные нам файлы и наша цель, допустим, дополнить файлы в /target файлами из /source.

Если бы папки источника и приёмника назывались одинаково, например, мы копировали бы из /source в /home/source, то можно было бы использовать команду:


И после копирования файлы в /home/source оказались бы дополненными файлами из /source.

Такая вот логическая задачка: мы можем дополнить файлы в директории-приёмнике, если папки называются одинаково, но если они отличаются, то папка-исходник будет помещена внутрь приёмника. Как скопировать файлы из /source в /target с помощью cp без wildcards?

Чтобы обойти это вредное ограничение мы используем неочевидное решение:


Те кто хорошо знаком с DOS и Linux уже всё поняли: внутри каждой папки есть 2 невидимые папки "." и "..", являющиеся псевдопапками-ссылками на текущую и вышестоящие директории.

  • При копировании cp проверяет существование и пытается создать /target/.
  • Такая директория существует и это есть /target
  • Файлы из /source скопированы в /target корректно.

Поведение этой команды однозначно. Всё отработает без ошибок вне зависимости от того миллион у вас файлов или их нет вовсе.

Выводы

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

Послесловие

vmspike предложил аналогичный по результату вариант команды:

ВНИМАНИЕ: регистр буквы T имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется.
Благодарности:

Обычной практикой является использование команды cp для копирования файлов и rsync для копирования каталогов.

Чтобы иметь возможность копировать файлы и каталоги, у вас должны быть как минимум права на чтение исходного файла и права записи в целевой каталог.

Копирование файлов с помощью команды cp

В операционных системах Linux и Unix команда cp используется для копирования файлов и каталогов.

Если целевой файл существует, он будет перезаписан. Чтобы получить запрос на подтверждение перед перезаписью файлов, используйте параметр -i .

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

Скопируйте файл в каталог

Чтобы скопировать файл в каталог, укажите абсолютный или относительный путь к каталогу. Если целевой каталог не указан, файл копируется в текущий каталог.

В следующем примере мы file.txt файл file.txt в file.txt /backup :

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

Если вы хотите скопировать файл под другим именем, вам необходимо указать желаемое имя файла:

Приведенная выше команда скопирует файл в указанный каталог как new_file.txt .

Копировать несколько файлов

Чтобы скопировать сразу несколько файлов и каталогов, укажите имена исходных файлов и каталогов, за которыми следует каталог назначения в качестве последнего аргумента:

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

Команда cp также позволяет использовать сопоставление с образцом. Например, чтобы скопировать все файлы .jpg из текущего каталога в каталог /backup , вы должны использовать:

Копирование каталогов с помощью команды cp

Чтобы скопировать каталог, включая все его файлы и подкаталоги, используйте параметр -R или -r . В следующем примере мы копируем каталог Pictures в Pictures_backup :

Приведенная выше команда создаст каталог назначения и рекурсивно скопирует все файлы и подкаталоги из источника в каталог назначения.

Если целевой каталог уже существует, сам исходный каталог и его содержимое копируются в целевой каталог. Чтобы скопировать только файлы и подкаталоги, но не целевой каталог, используйте параметр -T :

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

Копирование файлов и каталогов с помощью команды rsync

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

Наиболее полезная опция -a которая рекурсивно копирует каталоги, передает специальные и блочные устройства и сохраняет символические ссылки, время модификации, группу, владение и разрешения.

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

Если целевой файл существует, rsync перезапишет его.

Эту же команду можно использовать для копирования каталога:

Чтобы узнать больше о rsync прочтите следующие статьи:

Выводы

Мы показали вам, как копировать файлы и каталоги в системах на базе Linux и Unix, используя утилиты cp и rsync .


Команда cp в Linux

что_копируем — файл, несколько файлов, директория или несколько директорий, которые необходимо скопировать.

куда_копируем — название файла, в который выполняется копирование другого файла, или директория, в которую копируются исходные файлы или директории.

Опции

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

МЕТОД определяет, каким образом формируется имя резервной копии. МЕТОД может принимать значения:

  • none или off — не делать резервных копий, даже если включена опция --backup
  • numbered или t — имя резервной копии получит числовой индекс (пример: myfile.txt
Скопировать содержимое специальных файлов (файлов устройств и FIFO) при рекурсивном копировании. Данную опцию использовать не рекомендуется. Если файл назначения существует и не может быть открыт, то удалить его и попытаться снова (данная опция игнорируется, если используется опция -n ). Вывести запрос на подтверждение перезаписи существующего файла. Переходить по символическим ссылкам, указанным в качестве источника. Никогда не разыменовывать символические ссылки. Ссылки копируются, как символические ссылки. Сохранять у файлов атрибуты, указанные через запятую в списке СписокАтрибутов
Если возможно, то можно использовать дополнительные атрибуты: context , links , xattr , all Не сохранять атрибутиы, указанные в списке СписокАтрибутов Формировать результирующее имя (результирующий путь) каждого копируемого файла с учетом полного пути, который указан для данного файла.

Например, при использовании команды cp --parents a/b/myfile dstdir , файл myfile будет скопирован в директорию dstdir/a/b . То есть будут созданы промежуточные директории.

Копировать директории. Используется рекурсивное копирование — копируются директории и все их содержимое. Создавать или не создавать «легкую» клонированную копию файла, если данная функциональность поддерживается файловой системой.

КОГДА может принимать значения:
always — всегда создавать «легкую» копию файла. Создается ссылка на исходные данные. Фактического копирования данных не происходит. Блоки данных копируются только тогда, когда они изменяются.
auto — создается обычная полная копия.

Опция задает то, как будет выполняться копирование разреженных (sparse) файлов. Разреженный файл — это файл, в котором последовательности нулевых байтов (дыры) заменены на информацию об этих последовательностях. То есть в метаданных файла содержится список дыр.

КОГДА может принимать значения:
auto — (поведение по умолчанию) копировать разреженные файлы в разреженные файлы.
always — результирующий файл всегда разреженный, если в исходном есть достаточное количество нулевых последовательностей.
never — не делать результирующие файлы разреженными.

Удалить у каждого исходного файла символ слеш / на конце. Изменить символ суффикса, который добавляется к именам резервных копий (при использовании опции --backup ). По умолчанию СУФФИКС равен значку тильды Перемещать только если исходный файл новее, чем файл назначения или если файл-назначения отсутствует. Выводить информацию о каждом файле, который обрабатывает команда cp. Пропускать директории, расположенные на других файловых системах. Установить контекст SELinux для результирующего файла в значение по умолчанию. Установить контекст SELinux или SMACK в значение CTX .

Примеры использования команды cp

Скопировать файл в другую директорию

Скопируем файл myfile.txt в директорию mydir :


Скопируем файл myfile1.txt в новый файл myfile2.txt

Скопировать несколько файлов

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

Скопировать файл с подтверждением

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

Показать информацию о копируемых файлах

При использовании опции -v выводится информация о том, какие файлы и куда копируются.

Скопировать директорию

Чтобы скопировать директорию и все ее содержимое нужно использовать опцию -r

Скопировать только если файлы новее

Скопируем файлы вида myfile*.txt (например, это могут быть файлы myfile1.txt myfile10.txt myfile2.txt ) в директорию mydir , но если результирующий файл существует, то копирование выполняется только в том случае, если исходный файл новее.

Не перезаписывать существующие файлы

Чтобы существующие файлы не перезаписывались, используется опция -n

Скопировать только атрибуты

Скопируем только атрибуты файла. Содержимое файла не копируется.

Создать резервную копию для результирующих файлов, если они существуют

Скопируем файл myfile1.txt в файл myfile2.txt . Если файл myfile2.txt существует, то будет создана его резервная копия.

Команда cp backup

Принудительно перезаписывать существующие файлы назначения

Если файл назначения существует и не может быть открыт и удален, то можно использовать опцию -f , чтобы принудительно перезаписать такой файл:

Читайте также: