Jak skopiować ukryte pliki i ukryte podkatalogi (te zaczynające się od kropki) z folderu A do folderu B? Na przykład, jeśli mam tę strukturę:
A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c
Chciałbym skopiować do B tylko ukryte pliki i ukryte podkatalogi w A:
B/.a
B/.b/
B/.b/somefile
B/.b/.c
Próbowałem już tego polecenia: cp A/.* B
z tego innego pytania superużytkownika . Jednak nie kopiuje podkatalogów. Próbowałem też cp -r A/.* B
, ale kopiuje, .
więc kończę dokładną kopią A (w tym normalnych plików). Każda pomoc jest mile widziana.
źródło
..c
..*[^.]
ale wtedy przegapisz pliki, które kończą się na.
. Myślę, że naprawdę potrzebujesz rozszerzonego globowania, aby naprawdę uwzględnić wszystkie przypadki.Problem
A/.*
polega na tym, że istnieje katalog,.
wA
którym również pasuje do wzorca.Możesz włączyć rozszerzone wzorce globów i użyć następujących opcji:
Pasuje do plików, których nazwa zaczyna się od kropki i których drugim znakiem nie jest ani kropka, ani nic (? (.) Nie pasuje do nic lub kropki,! (...) neguje to znaczy!! (? (.)) Pasuje do wszystkiego innego niż nic lub kropka).
źródło
.!(@(|.))
jest to (AFAICT) równoważne z powyższym, (IMNSHO) jest trochę wyraźniejsze i tylko jedna postać jest dłuższa.W takich przypadkach zaleca się użycie
find
zamiastcp
tego:Podstawowa składnia dzieli się następująco:
find A/ -type f
:find
elementy w katalogu,A/
którego typem jest plik (zamiast katalogu)…-maxdepth 1 -name '.*'
: Do tego dla jednegomaxdepth
z katalogów i od któregoname
zaczyna się.
.-exec cp -p {} B/ \;
: A kiedy znajdują się te pliki, komenda z flagą zachować dat / razy od źródła ( ) do miejsca przeznaczenia .exec
cp
-p
{}
B/
Lubię
maxdepth
dodawać warstwę kontrolną, więc nie kopiuję przypadkowo całego systemu plików. Ale możesz to usunąć.źródło
find A -type d
zapewnia listę rekurencyjną w obrębie A zawierającą tylko katalogigrep -E "\."
filtruje katalogi kropką (tzn. ukryte katalogi)cp -r
kopiować rekurencyjnieUtworzyłem strukturę plików i folderów dla A i wykonałem polecenie w Git Bash (w tej chwili nie mam Linuksa) i zadziałało.
źródło
A B
, a wtedy zadziałałoby to nieoczekiwanie, ponieważ rozwinąłoby się docp -r A B/.dotfile B
. Ogólna rada to w ogóle nie analizowaćfind
anils
generować wyników . Jeśli używaszfind
, powinieneś również użyć własnych opcji do filtrowaniagrep
, a jeślifind
przesyłasz dane wyjściowe gdzie indziej, użyj-print0
lub bezpośrednio wywołaj żądane polecenie. Zobaczfind
instrukcję .extglob
one ustawienia).find
parsowanie.Alternatywnie możesz użyć tego innego polecenia, jeśli drugi znak jest alfanumeryczny ( źródło ):
źródło
.@foo
lub..c
.