Как вы копируете все содержимое одного каталога в другой?
Например:
$ cd /home/newuser
$ cp -a /backup/olduser/* .
Проблема с вышесказанным заключается в том, что шаблон «*» соответствует скрытым каталогам. и '..', и вы получите каталог 'olduser' внутри 'newuser', а также его содержимое.
Вы также можете сделать что-то вроде этого:
$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser
Но что, если newuser уже содержит некоторые файлы и каталоги по умолчанию?
Какой самый простой, самый правильный, самый простой для запоминания и не запутанный способ переместить содержимое одного каталога в другой, используя только простую команду 'cp' и оболочку?
.
и..
работать. Хотите объяснить?cp -r ./a b
не сработало. Есть идеи почему?r
опция не нужна.a
Вариант подразумеваетr
.-a
Параметр не делает ничего , чтобы помочь в этой ситуации. Командаcp -r ./a/. b
скопирует содержимое каталога и только содержимое каталогаa
в каталогb
. В-a
флаг консервы ссылки, метки времени и т.д., которая не имеет отношения к вопросу.Две директории а и б.
У обоих есть файлы в.
Вы находитесь в каталоге, который содержит a и b.
-r
= рекурсивноисточник
cp
скопировать каталогa
, иa/.somedotfile
он содержится вa
. еслиb
существует, эта команда создаст точную копиюa
вb/a
.cp -R /some/dir/* /another/dir
Помните, что по умолчанию
cp
копируется первый каталог во второй каталог, если второй существует.Например
cp -r a b
, скопировать каталогa
вb
. Еслиb
не существует, он будет создан с содержаниемa
.Если вы хотите , чтобы скопировать содержимое из
a
вb
(например , при копировании всей файловой системы в точке монтирования) использование:как в предыдущем ответе.
Обратите также внимание, что
-a
в некоторых других ответах используется то же самое, что-dr --preserve=all
и метки времени, контекст и расширенные атрибуты.источник
/.
работает?a/.
представляет содержимое каталога 'a' в отличие от самого каталога, в большинстве случаев он является синонимом, но при использованииcp -r
он избегает поведения cp по умолчанию (копирование INTO b).Если вы серьезно не перенастроили свою оболочку, шаблон '*' не соответствует '.' или «..», как вы можете проверить, используя только echo *. Вместо этого он пропускает файлы, имя которых начинается с «.», Поэтому ваш подход пропустит все скрытые файлы. Вы можете настроить некоторые из этих параметров с помощью параметров оболочки, например, параметра dotglob в bash, но тогда он не будет переносимым и надежным вариантом, который вы ищете.
Если вам нужно сделать это более одного или двух раз, я рекомендую вам рассмотреть rsync или unison (в зависимости от конкретных потребностей) с тщательно разработанными исходными и целевыми спецификациями.
Другая альтернатива - поместить исходный каталог в tar-архив и распаковать его поверх существующего целевого каталога.
источник
( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )
...tar cf - .
tar является исходным каталогом, включая dotfiles, и сплит его в STDOUT, который передается по каналу STDINtar xf -
.Это скопирует как нормальные, так и скрытые файлы, исключая родительский каталог (
..
):Если вы не исключите родительский каталог, вы также получите все содержимое
..
каталога назначения.источник
..
(например,...
или..super-hidden
).Чтобы скопировать файлы, начинающиеся с точки, просто выполните команду cp. * Target /
Так что проще всего сделать команду cp два раза.
Как говорит Питер Айзентраут, нормальные правила не включают ... и. (хм, как закончить это предложение?;)
Просто используйте -r, чтобы сделать его рекурсивным, и -i, чтобы cp спросил, действительно ли вы хотите перезаписать файл.
источник
*
не соответствует.
или..
, но это не так, если вы используете.*
. Попробуйecho .*
. Вы можете исключить.
и..
со следующей схемой:.[^.]*
..[^.]*
все равно исключаются имена, начинающиеся с..
(например,...
или..super-hidden
).Это работает для копирования всех файлов и каталогов, за исключением рекурсивных скрытых каталогов из текущего каталога в любое место:
источник