4

Ситуация 1

Как мне скопировать /home/src/somedir в /dest/ так, чтобы путь всегда заканчивался как /dest/somedir , независимо от того, существует ли /dest/somedir ?

Я хочу избегать использования /dest/somedir/somedir .

Ситуация 2

Как мне скопировать все в /home/src/somedir в /dest/ , чтобы /dest/somedir не создавался и игнорировался, если он уже существует?


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

2 ответа2

6

cp всегда копирует файл (ы) в начале команды в файл или каталог в конце команды. Косая черта не имеет большого значения для аргументов, если аргумент не является символической ссылкой на каталог. Тогда косая черта будет рассматривать его как каталог, в то время как косая черта копирует саму ссылку.

Предполагая, что вы хотите рекурсивно копировать любые подкаталоги в своих примерах, вы сделаете их так:

cp -r /home/src/somedir /dest

а также

cp -r /home/src/somedir/* /dest

Первый получает каталог /home/src/somedir и копирует этот аргумент, сам каталог и все его содержимое в последний аргумент /dest . При необходимости он создаст каталог somedir в /dest и будет использовать его, если он уже существует.

Второй добавляет * к концу первого аргумента, который будет расширяться оболочкой для каждого файла, с которого не начинается . в /home/src/somedir и скопирует все эти файлы и каталоги в /dest независимо от того, что там уже есть (за исключением того, что некоторые флаги для cp заставят перезаписать файлы, которые будут иметь то же значение в месте назначения, что и существующий файл).

Как отмечалось в комментариях к этому ответу, существуют проблемы с использованием * для захвата всех файлов в каталоге. Один из вариантов - использовать tar для копирования.

tar -c -C /home/src/somedir . | tar -x -C /dest

это создаст tar-файл somedir без начального пути, используя -C чтобы сначала переключиться на этот каталог. По умолчанию tar будет печатать в стандартный stdout который мы затем передадим по конвейеру другому tar чтобы извлечь его, переключаясь в нужный каталог /dest . Это также сохранит множество атрибутов файла, что может сделать и cp .

2

Как мне скопировать /home /src /somedir в /dest / так, чтобы путь всегда заканчивался как /dest /somedir, независимо от того, существует ли /dest /somedir?

cp -rv /home/src/somedir /dest

Мы копируем «somedir» в «/dest», поэтому получаем «/dest/somedir»

Как мне скопировать все в /home /src /somedir в /dest /, чтобы /dest /somedir не создавался и игнорировался, если он уже существует?

cp -rv /home/src/somedir/* /dest

Мы копируем «все файлы в somedir» (somedir/*) в «/dest»

Предостережение: somedir/* не включает скрытые файлы (те, которые начинаются с точки).

Последние косые черты не влияют на процесс. Вы можете путать cp с rsync , где косая черта означает «копировать содержимое, а не папку».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .