Miałem nadzieję:
cp -R src/prog.js images/icon.jpg /tmp/package
dałoby symetryczną strukturę w katalogu docelowym:
/tmp
|
+-- package
|
+-- src
| |
| +-- prog.js
|
+-- images
|
+-- icon.jpg
ale zamiast tego oba pliki są kopiowane do / tmp / package. Płaska kopia. (To jest na OSX).
Czy istnieje prosta funkcja bash, której mogę użyć do skopiowania wszystkich plików, w tym plików określonych za pomocą symboli wieloznacznych (np. Src / *. Js) w ich właściwe miejsce w katalogu docelowym. Trochę jak „dla każdego pliku uruchom mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file")
”, ale być może jedno polecenie.
To jest istotny wątek, który sugeruje, że nie jest to możliwe. Autorskie rozwiązanie nie jest jednak dla mnie zbyt przydatne, ponieważ chciałbym po prostu podać listę plików, bez symboli wieloznacznych lub nie, i skopiować je wszystkie do docelowego katalogu. IIRC MS-DOS xcopy robi to, ale wydaje się, że nie ma odpowiednika dla cp.
cp --parents
jest niedozwoloną opcją w OSX (BSD cp), alegcp
(GNU cp) działa dobrze. Jeśli nie ma go jeszcze w twoim systemie, użyjbrew install coreutils
. Będziesz mieć wiele narzędzi z prefiksem g.cp -R --parents
irsync -rR
kopiuje względnie zarówno pliki, jak i katalogi.Jednokierunkowa:
źródło
-C
opcji, aby zrobić chdir za Ciebie -tar cf - _files_ | tar -C /dest xf -
lub coś w tym stylu.Alternatywnie, jeśli jesteś oldschoolowy, użyj cpio:
Oczywiście możesz filtrować listę plików według własnego uznania.
Opcja „-p” dotyczy trybu „tranzytowego” (w porównaniu z „-i” dla wejścia lub „-o” dla wyjścia). Opcja „-v” jest gadatliwa (wyświetla pliki w trakcie ich przetwarzania). „-M” zachowuje czasy modyfikacji. „-B” oznacza użycie „dużych bloków” (gdzie duże bloki mają 5120 bajtów zamiast 512 bajtów); możliwe, że obecnie nie ma to żadnego efektu.
źródło
-print0
kombinacji--null
opcji, aby nie zerwała ze znakami specjalnymi i takimi:find . -print0 | cpio -pvdmB --null /target
cpio
temu zadaniu. Zgadzam się, że należy użyć opcji-print0
i-null
, w przeciwnym razie w pewnym momencie ktoś poda Ci foldery ze „znakami specjalnymi” (najprawdopodobniej spacjami) i coś się stanie. Nie mówię o tym z własnego doświadczenia, ale możesz spróbować wykonać kopię zapasową kilku plików i skończyć z kopią zapasową tylko połowy z nich ze względu na spacje w nazwach plików. (Ok, mówię z własnego doświadczenia.)cpio
tak, jak pokazano, jeśli nazwy plików zawierają znaki nowej linii - wtedy zwykle pojawia się komunikat o błędzie, że nie znaleziono dwóch (lub więcej) nazw plików dla każdego nowego wiersza w nazwie pliku. (Czasami możesz otrzymać mniej komunikatów - ale wymaga to dużej ostrożności podczas tworzenia przypadku testowego). Kiedy użyłemcpio
, nie było--null
opcji; opcje z podwójnym myślnikiem nie były częścią notacji opcji SVR4, a koncepcja-print0
nie była obecna wfind
obu. Ale to było dawno temu (na przykład połowa lat 90. zanim Linux osiągnął dominację).xargs
w miksie - dzieli się na białe znaki - spacje, tabulatory, znaki nowej linii. OTOH, nie jestem pewien, jak i dlaczego to zrobiłeś. Instrukcja GNUcpio
dotycząca trybu wyjściowego zawiera informacje o jednej nazwie pliku w każdym wierszu. Podręcznik użytkownika SVR4 (wydrukowany 1990) jest niejasny:cpio -o
(tryb kopiowania) czyta standardowe wejście w celu uzyskania listy nazw ścieżek i kopiuje te pliki na standardowe wyjście wraz z nazwą ścieżki i informacjami o stanie. Jest zatem szansa, że złamał nazwy w spacjach.Opcja -R rsync zrobi to, czego oczekujesz. To bardzo bogata w funkcje kopiarka plików. Na przykład:
Przykładowe wyniki:
źródło
rsync oczywiście! tutorial tutaj. i tu
Albo unisono
źródło
Próbować...
więc za to, co robiłeś pierwotnie ...
lub
źródło
echo
ani$v
tutaj. Ta metoda również zakończy się niepowodzeniem, jeśli odpowiedni katalog nie istnieje w miejscu docelowym.