Próbuję skopiować wszystkie pliki i foldery z jednego katalogu do drugiego, ale wykluczam niektóre pliki. W szczególności chcę wykluczyć pliki i foldery subversion. Chciałbym jednak ogólne, ale zwięzłe rozwiązanie.
Wyobrażam sobie, że w najbliższej przyszłości będę musiał wykluczyć kilka rodzajów plików. Na przykład mogę wykluczyć .svn, * .bak i * .prj.
Oto, po co to przygotowałem, ale to nie działa dla mnie. Pierwsza część, znajdź działa, ale robię coś złego z xargs i cp . Próbowałem cp zi bez -R
. Ponadto używam OS X i wygląda na to, że ma mniej polecaną wersję Xargsa niż systemy Linux.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
find
polecenie prawidłowo używa-prune
do wykluczenia elementów .svn, to przekazujesz-R
flagę,cp
która mówi, że to polecenie ma być rekurencyjne. Kiedy tak się dzieje, tracisz wszelką ziarnistość, jaką posiadasz wfind
poleceniu. Będę majstrować przy tym przez chwilę, ale myślę, że odpowiedzi nie należy używać-R
wcp
poleceniu.-R
flaga, jestem całkiem pewien. Usuń to i powinieneś być w porządku (choć możesz chcieć dodać,-mindepth 1
aby zignorować folder katalogu najwyższego poziomu, którego nie chcesz kopiować, zakładam)Odpowiedzi:
(Edytowane po ponownym przeczytaniu pytania. Pytający mówi, że rsync nie jest zainstalowany)
Możliwym problemem z rozwiązaniem find / xargs są spacje w nazwach plików. Aby obejść ten problem, powiedz find i xargs, aby użyły znaku zerowego (ASCII 0) do rozdzielenia znalezionych plików:
Jeśli okaże się, że rsync jest dostępny, nadal uważam, że rsync jest zdecydowanie lepszym rozwiązaniem:
Użyj rsync z opcją -C. Ze strony man rsync :
Spowoduje to, że rsync zignoruje następujące wzorce:
Na przykład:
(uwaga: jeśli jeszcze nie znasz zbytnio rsync, przeczytaj na tej stronie podręcznika o tym, jak rsync radzi sobie z końcowym ukośnikiem na ścieżce źródłowej. Zachowuje się inaczej, jeśli umieścisz ukośnik niż w innym przypadku. Wyszukaj „trailing slash”)
źródło
-R
flagi wxargs
części polecenia.Nie jest to ogólne rozwiązanie, ale ... możesz użyć polecenia svn export, aby utworzyć kopię obszaru roboczego bez folderów metadanych .svn.
źródło
jeśli chcesz, możesz nawet umieścić „pv” lub coś podobnego pomiędzy 2 procesami tar.
źródło
Brudny, ale szybki i zwięzły sposób:
Spowoduje to skopiowanie jednego katalogu do drugiego (a więc opcja rekurencyjna
-r
), a następnie rekurencyjne usunięcie wszystkiego o nazwie.svn
(ignorowanie wielkości liter).źródło
Postąpiłbym inaczej, używając tar i mechanizmu wykluczającego.
Z w katalogu docelowym:
Spowoduje to cd do źródła, tarowanie zawartości, z wyłączeniem tego, co jest wymienione w excludefile, a następnie rozpakowanie do bieżącego katalogu.
źródło
Zredagowana odpowiedź : Problem polega na tym,
-R
że kopiowanie jest rekurencyjne, więc w rezultacie kopiujesz ukryte pliki. Oto czego użyłbym:-mindepth 1
Flag opowiadafind
ignorować katalogu Toplevel. Ponieważ chcesz skopiować całą zawartość tego katalogu do nowego katalogu najwyższego poziomu, zakładam, że tego nie chcesz.Jak mówi Chris Nava w swojej odpowiedzi , istnieje już wbudowany sposób, aby to zrobić, jeśli mówimy o folderach SVN, ale ponieważ poprosiłeś o bardziej ogólne rozwiązanie, może to trochę pomóc.
źródło
xargs
nie jest zepsuty, ale w systemach uniksowych domyślnie nie używa się nazw plików (lub nazw katalogów) ze spacjami w nich. Jeśli w nazwach plików (lub nazwach katalogów) znajdują się spacje lub „śmieszne” znaki, musisz wykonać dodatkową pracę, aby sobie z tym poradzić. (W GNUfind
, istnieje cała sekcja naman
stronie o nazwie „Unusual NAZWY PLIKÓW” z powodu tego problemu.) Do-0
flagixargs
i-print0
zafind
pomoc do rozwiązania tych problemów. Obiecuję ci jednak, że nie chcesz używać-R
polecenia kopiowania. Cofnie to, co zrobisz, aby uniknąć katalogów SVN.Przypuszczam, że to zależy od tego, jak duże jest twoje drzewo, ale dlaczego nie po prostu najpierw skopiować wszystko , a następnie przyciąć foldery .svn po:
?
źródło
find
polecenia może zająć trochę więcej czasu , ale robisz to tylko raz. Możesz użyć polecenia setki razy, gdy już dobrze je wykonasz.find
siebie lepiej, aby nie musiałem tego robić. Ale masz rację: w tym rozwiązaniu nie ma nic złego.Nie zapomnij grep -v
źródło
Możesz także zrobić odwrotnie. Skopiuj wszystko, a następnie usuń foldery .svn za pomocą poniższego polecenia:
źródło