Jak skopiować ścieżkę katalogu zachowującego pliki w systemie Linux?

88

Mam w nich projekty Eclipse i plik „.project”, struktura katalogów wygląda jak „ myProject/.project”. Chcę skopiować te pliki „.project” do innego katalogu, ale chcę zachować nazwę otaczającego katalogu.

Powiedzmy, że mam „ a/myProject/.project”, chcę skopiować „ myProject/.project” na „ b”, więc być „ b/myProject/.project”, ale „ b/myProject” nie istnieje. Kiedy próbuję w:

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

kopiuje tylko sam plik „.project”, bez katalogu „myProject”. Proszę doradź.

dhblah
źródło

Odpowiedzi:

153

Potrzebny przełącznik to --parentsnp .:

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
James Yale
źródło
7

Użyj tarz czymś takim jak:

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

(Nie przetestowano. Najpierw przetestuj na sucho lub wypróbuj scenariusz makiety.)

lorenzog
źródło
działa zaskakująco dobrze! Na komputerze Mac: mkdir b; tar -c -f new.tar $ (cat myP); tar -x -f new.tar -C b /; #myP to plik tekstowy z listą ścieżek do plików do skopiowania
Alexey,
4

Najpierw użyj, mkdir -paby utworzyć folder docelowy z rekurencyjnym tworzeniem ścieżki nadrzędnej. Następnie skopiuj zawartość do folderu docelowego:

mkdir -p b/myProject/.project
cp -r a/myProject/.project/file b/myProject/.project
Weimin
źródło
3
cp -P a/myProject/.project b

Zobacz man cpwięcej informacji.

Maxfer
źródło
To chyba nie pomaga. Kopiuje sam „.project” do b, ale nie kopiuje „myProject”.
dhblah
3

Używam cpio w połączeniu z find. Wyjaśnienie tutaj .

Przykład twojego przypadku użycia:

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

To polecenie znajduje wszystkie pliki /a/myProject/.project/i kopiuje, zachowując ścieżkę, wszystkie zawarte w nim pliki.

Alex Avlonitis
źródło
1
.project to plik, a nie reż!
ddbug
1

Oprócz --parentstego wymagane jest również dodanie -ropcji, aby uniknąć pomijania kopii większości wewnętrznych katalogów

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

Tak więc polecenie, które działa dla mnie, jest

$ cp --parents -r test/1/.moo test2/
cml.co
źródło
0

Należy pamiętać, że wydaje się, że występuje błąd cp --parents. Gdy korzystałem --parentsz niego --preserve=all, atrybuty daty i godziny NIEKTÓRYCH katalogów docelowych NIE zostały zachowane.

Poniższy link wydaje się potwierdzać, że jest to błąd: błąd # 8767: cp: --preserve = wszystko nie działa dla rodziców, gdy użyto opcji --parent .

Wygląda więc na to, że nie można polegać na zachowaniu atrybutów podczas używania --parentsrazem z takimi jak --preserve=alllub -p.

chandra67
źródło
-3

Kiedyś --parentsz cpdowództwem i pracował perfeclty ze mną. aby uzyskać więcej informacji, zawsze używaj instrukcji. Dziękuję Ci.

sys0dm1n
źródło
3
Nie dodaje niczego do pozostałych 5 odpowiedzi.
Deer Hunter
Autorzy odpowiedzą, że .project w Eclipse jest plikiem, a nie katalogiem. Tak więc np. Mkdir -pa / .project nie ma sensu.
ddbug