Czy można to zrobić: „Jak mogę skopiować podzbiór plików z katalogu, zachowując jednocześnie strukturę folderów?” , ale bez użycia rsync?
Czy można to zrobić tylko przy użyciu cp, find i grep?
Mam bardzo ograniczoną powłokę bash (tj. Jest to powłoka git pod Windows :(), więc rsync nie jest opcją.
Wiem, że mogę dostać cygwin, ale zastanawiałem się, co mogę zrobić w tej ograniczonej sytuacji.
directory-structure
file-copy
Słoneczny
źródło
źródło
bash
dostępny?robocopy
można to zrobić bezpośrednio w systemie Windows (robocopy /S sourcedir targetdir *blah*
)Odpowiedzi:
Możesz użyć
tar
lubcpio
lubpax
(jeśli którykolwiek z nich jest dostępny), aby skopiować określone pliki, tworząc w razie potrzeby katalogi docelowe. Za pomocą GNU tar, aby skopiować wszystkie zwykłe pliki o nazwie*.txt
lubREADME.*
pod bieżącym katalogiem do tej samej hierarchii pod../destination
:Wystarczy
find
,cp
,mkdir
a powłoki, można pętli nad pożądanych plików zfind
i uruchomić polecenie powłoki kopiować każdego z nich. Jest to powolne i uciążliwe, ale bardzo przenośne. Fragment powłoki otrzymuje docelowy katalog główny as$0
i ścieżkę do pliku źródłowego as$1
; w razie potrzeby tworzy docelowe drzewo katalogów (zwróć uwagę, że uprawnienia do katalogu nie są zachowywane przez poniższy kod), a następnie kopiuje plik. Poniższy fragment kodu działa w każdym systemie POSIX i większości instalacji BusyBox.Możesz grupować
sh
wywołania; jest to trochę skomplikowane, ale może być mierzalnie szybsze.Jeśli masz bash ≥4 (nie wiem, czy Git Bash jest wystarczająco nowy), nie musisz dzwonić
find
, możesz użyć**
wzorca globu, aby powrócić do podkatalogów.źródło
Możesz spróbować czegoś takiego:
Próbowałem tego na moim systemie Linux i działa. Zwróć uwagę na parametr -R w cp, jeśli chcesz, to rekurencyjny. Zwróć także uwagę na parametr -i o xargs, wstawi on dane wyjściowe do miejsca, w którym umieścisz {}. -t służy tylko do powtórzenia polecenia stderr.
Moja struktura katalogu testowego wyglądała następująco:
źródło