33

Как вы копируете все содержимое одного каталога в другой?

Например:

$ cd /home/newuser
$ cp -a /backup/olduser/* .

Проблема с вышесказанным заключается в том, что шаблон «*» подстановки совпадает со скрытыми каталогами. и '..', и вы получите каталог 'olduser' внутри 'newuser', а также его содержимое.

Вы также можете сделать что-то вроде этого:

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

Но что, если newuser уже содержит некоторые файлы и каталоги по умолчанию?

Какой самый простой, самый правильный, самый простой для запоминания и не запутанный способ переместить содержимое одного каталога в другой, используя только простую команду 'cp' и оболочку?

7 ответов7

30

Пытаться:

cp -ra /backup/olduser/. /home/newuser
23

Два каталога а и б.

У обоих есть файлы в.

Вы находитесь в каталоге, который содержит a и b.

cp -r ./a b

-r = рекурсивно.

18

Также помните, что по умолчанию cp копирует первый каталог во второй каталог, если второй существует. Например, cp -a a b скопирует INTO b, если b существует, то есть создаст a в b.

Если это не то, что вам нужно, и вы хотите скопировать содержимое a в b (например, при копировании всей файловой системы в точку монтирования), используйте:

cp -a a/. b

как в предыдущем ответе.

Также обратите внимание, что -a включает -r так что -ar избыточен.

6

Если вы серьезно не перенастроили свою оболочку, шаблон '*' не совпадает с '.' или «..», как вы можете проверить, используя только echo *. Вместо этого он пропускает файлы, имена которых начинаются с «.», Поэтому ваш подход пропустит все скрытые файлы. Вы можете настроить некоторые из этих параметров с помощью параметров оболочки, например, параметра dotglob в bash, но тогда он не будет переносимым и надежным вариантом, который вы ищете.

Если вам нужно сделать это более одного или двух раз, я рекомендую вам рассмотреть rsync или unison (в зависимости от конкретных потребностей) с тщательно разработанными исходными и целевыми спецификациями.

Другая альтернатива - поместить исходный каталог в tar-архив и распаковать его поверх существующего целевого каталога.

2

Это скопирует как нормальные, так и скрытые файлы, исключая родительский каталог (..):

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

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

0

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

cp -rf * ^.* 
0

Чтобы скопировать файлы, начинающиеся с точки, просто выполните команду cp. * Target /

Так что проще всего сделать команду cp два раза.

Как говорит Питер Айзентраут, нормальные правила глобализации не включают .. и. (хм, как закончить это предложение? ;)

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

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/

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