Rekurencyjne kopiowanie ukrytych plików - Linux

19

Czy istnieje prosty sposób na rekurencyjne kopiowanie wszystkich ukrytych plików z katalogu do innego katalogu? Chciałbym wykonać kopię zapasową wszystkich plików ustawień w katalogu domowym, a nie zwykłych plików. Próbowałem:

cp -R .* directory

ale rozpoznaje .i ..rekurencyjnie kopiuje również wszystkie nie ukryte pliki. Czy istnieje sposób, aby cp zignorował .i ..?

Zifre
źródło
Czy jest jakaś różnica między -ri -R?
Chaminda Bandara

Odpowiedzi:

15

Moimi ulubionymi do przeniesienia reżimów były:

tar cvf - . | (cd /dest/dir; tar xvf -)

który przetwarza bieżący katalog na standardowe wyjście, a następnie potokuje go do podpowłoki, która najpierw cd do katalogu docelowego przed rozpakowaniem standardowego wejścia. Prosty, bezpośredni, rozszerzalny - zastanów się, co się stanie, gdy zamienisz () na ssh na inną maszynę. Lub, aby odpowiedzieć na twoje pytanie, możesz:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
pjz
źródło
1
Dzięki, opcja wykluczenia jest tym, czego potrzebowałem. Zrobiłem to już w inny sposób, ale zachowam to na przyszłość. Wydaje się to bardzo elastyczne (choć może wolniejsze).
Zifre
1
Dobra rada. Mam kilka ulepszeń: 1) Użyj cd /dest/dir && tar xvf -. &&Powstrzyma cię od blatting nad katalogu źródłowego, jeśli masz literówkę w miejscu przeznaczenia. 2) Potrzebujesz vflagi tar tylko na jednym z poleceń tar (lub żadnym z nich).
Tom Shaw
Słusznie. Byłem także znany z grupowania rzeczy w inny sposób: aby skopiować tutaj zdalny plik srcdir, zrób(cd /src/dir && tar cf - .) | tar xvf -
pjz
17

Niemal za każdym razem można to rozwiązać za pomocą:

cp -R .[a-zA-Z0-9]* directory

To dość niezwykłe, że ukryty plik nie zaczyna się od jednej z tych postaci.

Dostępne są inne dopasowania wzorca ( .??*, .[^.]*) - patrz komentarze

Alnitak
źródło
To zignoruje tylko.-Xyz - elementy w [] pasują tylko do pierwszego znaku po kropce.
Hamish Downer
6
. [^.] * złapałby wszystko
falstro
1
... z wyjątkiem rzeczy zaczynających się od dwóch kropek.
falstro
@roe - to też fajna wersja
Alnitak
@mish - tak, powiedziałem tyle samo w odpowiedzi.
Alnitak
11

Możesz użyć rsync.

rsync -a ./ /some/other/directory/

który skopiuje zawartość bieżącego katalogu (w tym pliki kropek, ale nie w tym ..)

Rory
źródło
Prosty i działa również w przypadku ukrytych plików w ukrytych folderach.
user59183,
dla mnie jest to mniej mylące i najskuteczniejsze z dostarczonych rozwiązań
palerdot
Niezłe rozwiązanie. Potrzebowałem też, żeby nie kopiować między .gitreż. Dodanie -C robi to, a więc polecenie staje się:rsync -aC ./ /some/other/directory/
term
10

Błagam Cię, krok od zwykłego rozszerzenia powłoki na cplinii poleceń - powłoki ekspansja ma wszelkiego rodzaju ahem . „Ciekawe” przypadkach rogu (niechcianej rekursji spowodowane i .., przestrzenie, niedrukowalny rzeczy, hardlinki, dowiązania symboliczne, i itd.) Użyj findzamiast tego (jest w findutilspakiecie, jeśli go nie masz - co byłoby dziwne, wszystkie dystrybucje instalują go domyślnie):

find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;

Wyjaśnienie krok po kroku:

  • -Hspowoduje, że findnie będą podążać za dowiązaniami symbolicznymi (z wyjątkiem sytuacji, gdy podana przez ciebie nazwa katalogu najwyższego poziomu jest dowiązaniem symbolicznym; to nastąpi).
  • /path/to/toplevel/dir/ ma oczywiście zostać zastąpione przez ciebie ścieżką do katalogu, w którym znajdują się pliki ustawień i katalogi, których kopię zapasową chcesz utworzyć.
  • -maxdepth 1przestanie findrekurencyjnie schodzić do katalogów, których nazwa zaczyna się od kropki. Nie musimy tego powtarzać, cpzrobimy to za nas, potrzebujemy tylko nazwisk na tym poziomie.
  • -name '.*'mówi, findże chcemy, aby wszystkie nazwy zaczynały się od kropki. To nie będzie działać poprawnie, jeśli zmienna środowiskowa POSIXLY_CORRECTjest ustawiona, ale rzadko (jeśli w ogóle) jest. Jest to pierwszy warunek dopasowania, jaki do tej pory określiliśmy.
  • a \( ....... \)jest i następuje po nim bardziej złożony warunek w nawiasach (użyłem ..... aby go zastąpić, wyjaśniono to poniżej). Musimy uciec z nawiasów, ponieważ w przeciwnym razie zostaną (źle) zinterpretowane przez powłokę, stąd ukośnik przed nimi,
  • -type d -o -type f -o -type lsą trzy warunki z jednym lub pomiędzy nimi. -type ddopasowuje katalogi, -type fdopasowuje zwykłe pliki i -type ldopasowuje dowiązania symboliczne. Możesz wybrać, co chcesz - na przykład, jeśli nie chcesz tworzyć kopii zapasowych katalogów ustawień, pomiń -type d(i -ooczywiście zaraz za nim).
  • -exec ..... \;każe findwykonać polecenie za każdym razem, gdy napotkane zostanie dopasowanie. Koniec polecenia jest oznaczony średnikiem, który ponownie musimy uciec ukośnikiem odwrotnym, aby uniknąć interpretacji powłoki. W tym wierszu polecenia musisz użyć {}miejsca, w którym ma się znaleźć nazwa aktualnie napotkanego dopasowania. Ponieważ muszle mogą również błędnie interpretować nawiasy klamrowe, powinieneś umieścić je w apostrofach, jak w '{}'. Polecenie, które chcemy wykonać w tym przypadku to cp -a '{}' /path/to/destination/dir/(-a oznacza archiwum, które powtarza się w podkatalogach, kopiuje dowiązania symboliczne jako łącza oraz zachowuje uprawnienia i rozszerzone atrybuty i /path/to/destination/dir/jest oczywiście nazwą katalogu docelowego - zamień go).

Tak więc, w prostym języku angielskim, ten findwiersz poleceń mówi:

Zacznij od / path / to / toplevel / dir /. Nie schodź do żadnych podkatalogów. Znajdź wszystkie katalogi, pliki i dowiązania symboliczne, których nazwa zaczyna się od kropki. Dla każdego znalezionego pliku skopiuj go do / path / to / destination / dir / zachowując naturę, uprawnienia i rozszerzone atrybuty.

Mihai Limbăşan
źródło
1
find jest najbardziej przydatną rzeczą w historii.
Mr. Shiny and New 安 宇
1
Niezła odpowiedź. Chociaż wolę -exec ... ';' Unikanie odwrotnego ukośnika oznacza, że ​​to polecenie będzie działać zarówno w CLI, jak i w
crontabie
8

Zawsze używałem. ?? * do wyszukiwania ukrytych plików bez uzyskiwania „.” i "..". Może jednak przegapić „.a” lub coś takiego, ale nigdy nie mam takiego.

Paul Tomblin
źródło
zdecydowanie miło i schludnie :) +1
falstro
Nie chcę, żeby tajemniczo zawiodła, jeśli są jakieś „.a”
Zifre
Podoba mi się, ponieważ jeśli wiesz, że nie masz ukrytych plików z pojedynczymi znakami, wpisywanie jest naprawdę szybkie.
Paul Tomblin
To musi być najlepsza odpowiedź. Powinien być oceniany na górę.
Ibn Saeed