Migruję mój katalog domowy ze starego systemu do nowego, a utworzony przeze mnie archiwum zawiera wszystko, w tym ukryte pliki, takie jak .bashrc. Jednak gdy przenoszę zawartość rozpakowanego archiwum (które znajdują się w / tmp) do mojego nowego katalogu domowego, ukryte pliki nie kopiują się ( mv /tmp/home/rcook/* /home/rcook/
). Jak mogę zmusić mv do ich przeniesienia?
Właściwie myślę, że problemem nie jest mv, ale globbing bash. Jeśli to zrobię:
mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/
Widzę to:
a/:
. .. .foo
b/:
. .. bar
a/.foo
nie poruszył się. Jak mogę uzyskać * symbol wieloznaczny, aby znaleźć ukryte pliki?
Tak, przypuszczam, że mógłbym zdekompresować plik archiwum bezpośrednio do mojego katalogu domowego, ale plik archiwum dekompresuje się do home/rcook/...
i chcę mieć pewność, że zastąpię nowy plik .bashrc
itp. Starymi, dostosowanymi wersjami i wiem, jak znaleźć i przenieść ukryte pliki jest cenną umiejętnością. Propozycje?
Niektóre odpowiedzi sugerują zrobienie czegoś takiego mv src/.* dest/
. Jednak wypróbowałem to w moich katalogach testowych i dostałem błędy. Począwszy od:
rcook$ ls -a a/ b/
a/:
. .. bar .foo
b/:
. ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
. .. bar
b/:
. .. .foo
Co ja robię źle?
źródło
Odpowiedzi:
Możesz to zrobić :
Możesz włożyć
W twojej
~/.bashrc
jeśli ma to być domyślny.Zobacz http://mywiki.wooledge.org/glob
Inne podejście do kopiowania plików kropek:
Nie używaj
..*
pasującego wzorca..
(wskaźnik do katalogu nadrzędnego). Jeśli istnieją pliki, których nazwa zaczyna się od dwóch kropek (..something
), użyj również wzorca..?*
.źródło
.
i..
są to katalogi specjalne: odpowiednio aktualny i macierzysty . To tylko ostrzeżenie. Lepszeshopt -s dotglob
rozwiązaniemv home/rcook/* /home/rcook/
potemmv home/rcook/.* /home/rcook/
. To załatwiło sprawę, choć żałuję, że nie skorzystałem z linku i najpierw przeczytałem o trybie dotglob. Oszczędziłoby mi to kroku. +1zsh
, można skorzystać zD
uogólniające kwalifikator lub wGLOB_DOTS
opcji powłoki .W twoich dodatkach masz błędy, ale kod nadal działa. Jedyną rzeczą do dodania jest to, że kazałeś mu tylko skopiować pliki kropkowe. Próbować:
Nadal będziesz otrzymywać błędy dotyczące. i .. wpisy, co jest w porządku. Ale ruch powinien się powieść.
źródło
.hidden
pliku, który miałem jawnie rozwiązać, aby rozwiązać mój problem.|| :
(||
oznacza to wykonanie polecenia false / error,:
to polecenie noop). Ale to również tłumiłoby prawidłowe błędy, np. Folder docelowy nie istnieje. Nie mogę znaleźć bardziej eleganckiego sposobumv
na wykluczenie wpisów.
i..
. Ale duży plus dla mnie nad cp to nie zapisywanie nowych plików na dysku.Jeśli jesteś
ls -l
w katalogu, zobaczysz.
i..
wśród wymienionych plików. Myślę więc, żemv .* /dest
bierze pod uwagę te wskazówki. Próbować:spowoduje to zignorowanie bieżących i nadrzędnych wskaźników katalogu.
Dostaniesz błąd, jeśli którykolwiek z tych trzech wzorców
*
,[^.]*
czy..?*
pasuje do żadnego pliku, więc należy uwzględnić tylko te, które pasują do siebie.źródło
Mogę wymyślić dwa możliwe rozwiązania. Pierwszym z nich jest użycie cp zamiast opcji rekurencyjnej, kopiowanie bieżącego katalogu do miejsca docelowego.
następnie możesz usunąć pliki źródłowe z bieżącego katalogu
Alternatywnie, jeśli wiesz, że pliki są nazwane zdrowo (bez spacji, symboli wieloznacznych, znaków niedrukowalnych), możesz zrobić coś takiego:
źródło
-p
zachowania metadanych. Używaniels
powinno być ostatecznością, a tutaj są lepsze, prostsze sposoby.W systemie Linux nie ma tak naprawdę „ukrytych” plików. Pliki zaczynające się od kropki są domyślnie ukryte przed listą plików.
Aby skopiować pliki nawet za pomocą globu, musisz poprzedzić ten plik znakiem,
.
np.mv -u .* foo
A potem.foo
zobaczysz, jakfoo/.foo
po przeniesieniu.Opcja -u przenosi pliki tylko wtedy, gdy źródło jest nowsze lub brakuje miejsca docelowego. Albo można po prostu zignorować błędy o przeprowadzce
.
i..
jak są specjalne pliki i nie można przesuwać, ale daj się złapać w.*
glob przez powłokę.źródło
Więc mamy:
i:
Sporo czasu poświęciłem na znalezienie lepszego rozwiązania niż wszystkie odpowiedzi tutaj.
Potem zajęło mi 30 sekund na to polecenie:
Potem znalazłem swoją miłość:
Uwaga: Nawet nie rozumiem argumentu
-T
. Po prostu zrobił to, czego potrzebowałem. Tutaj jest napisane:źródło
-T
. Tak czy inaczej, w zasadzie mówi to mv, aby przenieść sam katalog, zamiast przenosić wszystkie pliki z jego wnętrza.W moim przypadku po prostu próbowałem
mv
znaleźć jeden ukryty plik, a oto rozwiązanie:Wyjaśnienie
Na początku próbowałem:
Ale nadal pojawiał się błąd:
Mimo że
ls -al
pokazał, że plikdest/
istnieje i istnieje.Wydaje się, że powodem jest to, że powłoka interpretowała „.” w nazwie pliku, więc przenosząc go do zmiennej, unika interpretacji. Prawdopodobnie istnieją inne sposoby rozwiązania tego problemu, ale to nam wystarczyło.
źródło
Jeśli chcesz skopiować pliki, w tym pliki ukryte, do bieżącego katalogu, w którym się znajdujesz.
źródło