Как скопировать файл, сохраняющий путь к каталогу в Linux?

88

У меня есть проекты Eclipse и файл ".project", структура каталогов выглядит как ' myProject/.project'. Я хочу скопировать эти файлы .project в другой каталог, но хочу, чтобы имя вложенного каталога было сохранено.

Допустим, у меня есть ' a/myProject/.project', я хочу скопировать ' myProject/.project' в ' b', так что будет ' b/myProject/.project', но ' b/myProject' не существует. Когда я пытаюсь в:

 cp -r ./myProject/.project ../b

он копирует только сам файл «.project» без каталога «myProject». Пожалуйста, порекомендуйте.

dhblah
источник

Ответы:

153

Переключатель, который вам нужен --parents, например:

jim@prometheus:~$ cp --parents test/1/.moo test2/
jim@prometheus:~$ ls -la test2/
total 42
drwxr-xr-x   3 jim jim    72 2010-09-14 09:32 .
drwxr-xr-x 356 jim jim 43136 2010-09-14 09:32 ..
drwxr-xr-x   3 jim jim    72 2010-09-14 09:32 test
jim@prometheus:~$ ls -la test2/test/1/.moo
-rw-r--r-- 1 jim jim 0 2010-09-14 09:32 test2/test/1/.moo
Джеймс Йель
источник
7

Используйте tarс чем-то вроде:

mkdir b; tar cpf - myProject/ | tar xpf - -C b/

(Не проверено. Сначала выполните пробный прогон или попробуйте в сценарии макета.)

lorenzog
источник
работает на удивление хорошо! На Mac: Mkdir B; tar -c -f new.tar $ (cat myP); tar -x -f new.tar -C b /; #myP - текстовый файл со списком копируемых путей к файлам
alexey
4

Сначала используйте mkdir -pдля создания папки назначения с созданием рекурсивного родительского пути. Затем скопируйте содержимое в папку назначения:

mkdir -p b/myProject/.project
cp -r a/myProject/.project/file b/myProject/.project
Weimin
источник
3
cp -P a/myProject/.project b

Смотрите man cpдля получения дополнительной информации.

Maxfer
источник
Это не похоже на помощь. Он только копирует сам .project в b, но не копирует myProject.
Дабл,
3

Я использую cpio в сочетании с find. Объяснение здесь .

Пример для вашего варианта использования:

find /a/myProject/.project/ -type f | cpio -p -dumv /b/.

Эта команда находит все файлы /a/myProject/.project/и копирует, сохраняя путь, любые файлы, содержащиеся внутри.

Алекс Авлонитис
источник
1
.project - это файл, а не dir!
ddbug
1

В дополнение к --parentsэтому также требуется добавить -rопцию, чтобы избежать пропуска копии самой внутренней директории

$ cp --parents test/1/.moo test2/
cp: omitting directory ‘test/1/.moo’

Так что команда, которая работает для меня это

$ cp --parents -r test/1/.moo test2/
cml.co
источник
0

Пожалуйста, имейте в виду, что, похоже, ошибка в cp --parents. Когда я использовал --parentsвместе с --preserve=all, атрибуты даты и времени НЕКОТОРЫХ целевых каталогов НЕ сохранялись.

Следующая ссылка, кажется, подтверждает, что это ошибка: ошибка # 8767: cp: --preserve = all не работает для родителей, когда используется --parent .

Таким образом, похоже, что вы не можете полагаться на атрибуты, сохраняемые при использовании --parentsвместе с такими как --preserve=allили -p.

chandra67
источник
-3

Я использовал --parentsс cpкомандой и работал отлично со мной. для более подробной информации всегда используйте руководство. Спасибо.

sys0dm1n
источник
3
Не добавляет ничего к другим 5 ответам.
Охотник на оленей
Отвечающие, пожалуйста, обратите внимание, что .project в Eclipse - это файл, а не каталог. Так, например, mkdir -pa / .project не имеет смысла.
ddbug 15.10.16