Próbuję uruchomić rsync, aby skopiować rekursywnie niektóre pliki w dół ścieżki na podstawie wzorca nazwy pliku, bez rozróżniania wielkości liter . Oto, co zrobiłem, aby uruchomić rsync:
$ rsync -avvz --include ='*/' --include='.*[Nn][Aa][Mm][E].*' --exclude='*' ./a/ ./b/
Nic się nie kopiuje, dane wyjściowe debugowania pokazują:
[sender] hiding file 1Name.txt because of pattern *
[sender] hiding file 1.txt because of pattern *
[sender] hiding file 2.txt because of pattern *
[sender] hiding file Name1.txt because of pattern *
[sender] hiding directory test1 because of pattern *
[sender] hiding file NaMe.txt because of pattern *
Próbowałem użyć: --include='*[Nn][Aa][Mm][E]*'
i innych kombinacji, ale nadal nie działa.
Jakieś pomysły na użycie wyrażenia regularnego w celu włączenia niektórych plików?
--exclude='*'
?Odpowiedzi:
rsync nie mówi wyrażenia regularnego. Możesz zaciągnąć się do szukania i grep, choć robi się to trochę tajemnicze. Aby znaleźć pliki docelowe:
Ale wszystkie mają przedrostek „a /” - co ma sens, ale chcemy, aby to była lista wzorców dołączania akceptowanych przez rsync, a ponieważ przedrostek „a /” nie działa dla rsync I ” Usunę to za pomocą cięcia:
Nadal jest problem - nadal będziemy pomijać pliki w podkatalogach, ponieważ rsync nie przeszukuje katalogów na liście wykluczeń. Użyję awk, aby dodać podkatalogi dowolnych pasujących plików do listy wzorców dołączania:
Pozostało tylko wysłać listę do rsync - możemy użyć argumentu --include-from = -, aby dostarczyć listę wzorców do rsync na standardowym wejściu. Tak więc w sumie:
Zauważ, że do katalogu źródłowego „a” odwołuje się dwie różne ścieżki - „a /” i „./a/”. To jest subtelne, ale ważne. Aby wszystko było bardziej spójne, dokonam ostatniej zmiany i zawsze będę odnosił się do katalogu źródłowego jako „./a/”. Oznacza to jednak, że polecenie cięcia musi się zmienić, ponieważ z przodu wyników wyszukiwania znajdzie się dodatkowy „./”.
źródło
-t
że to prawidłowy przełącznik.sed "s#^$1/*##"
buuuut, który zepsuje się na ścieżkach zawierających #. Aby to naprawić, musimy zacytować nazwę przychodzącego katalogu:prefix=$(echo "$1" | sed 's#/#\\/#g')
a następniesed "s/^$prefix\\/*//"
podniosłości cytowania bash są trochę koszmarem;)Sugerowałbym użyć opcji filtrowania rsync. Na przykład wpisz:
pierwsza reguła filtra mówi rsync, jakie wzorce należy uwzględnić. Druga reguła jest potrzebna, aby powiedzieć rsync, aby sprawdził wszystkie katalogi podczas jego przechodzenia. Aby zapobiec włączeniu pustych katalogów, są one jawnie wykluczane przez
-m
opcję. Ostatnia reguła filtra mówi rsync, aby pozbyła się wszystkich pozostałych wzorców, które do tej pory nie pasowały.źródło
Jeśli używasz ZSH, możesz użyć flagi (#i), aby wyłączyć rozróżnianie wielkości liter. Przykład:
ZSH obsługuje również wykluczenia, które są określone tak jak zwykła ścieżka, ale mają początkowe ~
Możesz łączyć wykluczenia:
Na koniec możesz określić, jaki rodzaj pliku chcesz zwrócić (katalog, plik itp.). Odbywa się to za pomocą (/) dla katalogu i (.) Dla pliku.
W oparciu o to wszystko wykonałbym to polecenie jako:
(Nie widzę potrzeby wyłączenia z tych selektorów)
źródło
Powyższa odpowiedź na @ sqweek jest niesamowita, ale podejrzewam, że ma błąd w
awk
skrypcie do generowania katalogów nadrzędnych, ponieważ daje mi np .:Byłem w stanie to naprawić, używając
gensub
zamiast tego:Tak więc jego pełne rozwiązanie, ze
awk
zmienionym bitem, brzmiałoby:źródło
sub("/[^/]*$")
).Wypróbowałem ze skryptem C #, ponieważ jest to język, z którym mam największe doświadczenie. Jestem w stanie stworzyć listę plików, które chcę dołączyć, ale ktoś rsync wciąż mówi mi, żeby wziął udział w wędrówce. Tworzy foldery, ale ignoruje pliki. Oto co mam ...
Najpierw zawartość katalogu:
Następnie dane wyjściowe skryptu C #:
I dane wyjściowe debugowania:
źródło
[EDYCJA] Działa to tylko lokalnie. W przypadku ścieżek zdalnych najpierw należy utworzyć strukturę katalogów.
Prostsze niż zaakceptowana odpowiedź; Użyj --file-from, który automatycznie zawiera katalogi nadrzędne i printf ścieżkę pliku za pomocą% P
Musisz tylko użyć
find
irsync
.źródło