rekurencyjnie kopiuj wszystkie pliki z jednego katalogu do drugiego z wyjątkami

8

Jak potrzebuję skopiować wszystkie pliki oprócz kilku katalogów z jednego katalogu do drugiego. na przykład:

cp -R test /www/test2 would copy all

Ale chcę wykluczyć 2 foldery o nazwie log i logi.

Próbowałem czegoś takiego:

find ~test -not -name logs,log |  cp -R test /www/test2 

Ale czy możesz mi pomóc w składni?

Micheal
źródło

Odpowiedzi:

10

Użyj rsync:

rsync -a --exclude=logs --exclude=log from/ to/
Bobah
źródło
rynsc trochę dla mnie zadziałało!
Micheal,
rsync jest teraz moim nowym przyjacielem :) Dzięki, wyjaśnienie jest fajne
Aleks
2

Myślę, że szukasz czegoś takiego:

find dir -type d ! \( -name 'log' -o -name 'logs' \) | xargs -I{} cp -R {} /www/test2/{}
Tim Pote
źródło
@sputnick zobacz moje zmiany. Jeśli znasz, możesz zaoferować za to wyrażenie emacs.
Tim Pote
0

Jeśli używasz :

shopt -s extglob
cp -R test/!(log|logs) /www/test2

Zobacz http://wiki.bash-hackers.org/syntax/pattern

Gilles Quenot
źródło
Co dzieje się, gdy struktura jest taka test/someotherdir/logs:? OP nigdy nie powiedział logi logsbył drugim co do wielkości katalogiem.
Tim Pote
Jeśli ponownie przeczytasz, komendy OP find ~test -not -name logs,logi logi powinny być podkatalogiem.
Gilles Quenot
findprzegląda rekursywnie wszystkie podkatalogi. Globowanie plików nie. Aby Twoja odpowiedź zadziałała logi logsmusiałaby być bezpośrednim podkatalogiem test.
Tim Pote,