To musi być popularne pytanie, ale nie mogłem znaleźć odpowiedzi.
Jak przenieść wszystkie pliki przez *, w tym pliki ukryte, a także do katalogu nadrzędnego w następujący sposób:
mv /path/subfolder/* /path/
Spowoduje to przeniesienie wszystkich plików do katalogu nadrzędnego, zgodnie z oczekiwaniami, ale nie spowoduje przeniesienia plików ukrytych. Jak to zrobić?
cp -r /path/to/source/. /destination
Odpowiedzi:
Obszerny zestaw rozwiązań tego problemu można znaleźć w odpowiedzi na pytanie dotyczące systemów UNIX i Linux na temat: Jak przenieść wszystkie pliki (w tym ukryte) z jednego katalogu do drugiego? . Pokazuje rozwiązania w Bash, zsh, ksh93, standard (POSIX) sh itp.
Możesz używać tych dwóch poleceń razem:
Lub wszyscy razem ( dzięki pfnuesel ):
Który rozszerza się do:
(przykład:
echo a{.,}b
rozwija się doa.b ab
)Zwróć uwagę, że spowoduje to wyświetlenie kilku ostrzeżeń:
Po prostu je zignoruj: dzieje się tak, ponieważ
/path/subfolder/{.,}*
rozwija się również do/path/subfolder/.
i/path/subfolder/..
, które są katalogiem i katalogiem nadrzędnym (zobacz: Co oznaczają „.” I „..”, gdy znajdują się w folderze? ).Jeśli chcesz po prostu skopiować, możesz użyć zwykłego:
Spowoduje to skopiowanie wszystkich plików, zarówno zwykłych, jak i ukrytych, ponieważ
/path/subfolder/.
rozwija się do „wszystkiego z tego katalogu” (Źródło: Jak skopiować za pomocą cp, aby uwzględnić ukryte pliki i ukryte katalogi oraz ich zawartość? )źródło
mv /path/subfolder/* /path/subfolder/.* /path/
, które nie są niezbędne do łączenia dwóch poleceń w jedno.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
oznacza bieżący katalog i..
oznaczaup
katalog. Musiałeś zauważyć, że wszystkie inne pliki zostały przeniesione.Myślę, że jest to najbardziej eleganckie, ponieważ też nie próbuje się ruszać
..
:źródło
..anything
lub...anything
itd. - stackoverflow.com/a/31438355/2351568 zawiera prawidłowy regex tego problemu. || ale tak czy inaczej, używanieshopt -s dotglob
jest nadal lepszym rozwiązaniem!{a,b}*
znajdzie wszystkie pliki zaczynające się od a lub b, na przykład „anatomia” i „buldożer”. Drugie dopasowanie jest po prostu pustym dopasowaniem, równoważne z*
, a pierwsze dopasowanie jest równoważne.[!.]
, gdzie grupa[!.]
oznacza grupę NIE rozpoczynającą się od.
. To znaczy,.*
ale nie..*
.Możesz włączyć
dotglob
:Aby wyłączyć
dotglob
, musisz powiedzieć:źródło
man shopt
nie działa ihelp shopt
jest bardzo krótki. Ale możesz to zrobić,bashman () { man bash | less -p "^ $1 "; }
a potembashman shopt
przeczytać wszystko na ten temat w prosty sposób. (Może być konieczne naciśnięcie n, aby przejść do polecenia, jeśli istnieją linie zaczynające się od shopt, jak znalazłem).ls
... więc prawdopodobnie nie jest to, czego chceszAlternatywnym prostszym rozwiązaniem jest użycie
rsync
narzędzia:Uwaga: powyższe polecenie pokaże, co zostanie zmienione. Aby wprowadzić zmiany, usuń
--dry-run
.Zaletą jest to, że oryginalny folder (
subfolder
) zostałby usunięty, jak również część polecenia, a korzystając zmv
przykładów tutaj, nadal musisz wyczyścić foldery, nie wspominając o dodatkowym bólu głowy, aby ukryć ukryte i nieukryte pliki w jednym wzór.Ponadto
rsync
zapewnia obsługę kopiowania / przenoszenia plików między pilotami i zapewnia, że pliki są kopiowane dokładnie tak, jak były pierwotnie (-a
).Użyty
-u
parametr pomija istniejące nowsze pliki,-r
wraca do katalogów i-v
zwiększa szczegółowość.źródło
sudo
i--dry-run
, aby ludzie mogli przetestować zmiany przed uruchomieniem rzeczywistego polecenia, aby uniknąć potencjalnego bałaganu.Pozwól, że przedstawię cię mojemu przyjacielowi „dotglob”. Włącza się i wyłącza niezależnie od tego, czy „*” obejmuje ukryte pliki.
Domyślnie jest wyłączone.
Najlepiej włączyć go ponownie, gdy skończysz, w przeciwnym razie pomieszasz rzeczy, które zakładają, że będzie wyłączone.
źródło
Używając
find
polecenia w połączeniu zmv
poleceniem, możesz uniemożliwićmv
poleceniu próby przeniesienia katalogów (np...
I.
) oraz podkatalogów. Oto jedna opcja:Istnieją problemy z niektórymi innymi udzielonymi odpowiedziami. Na przykład każdy z poniższych spróbuje przenieść podkatalogi ze ścieżki źródłowej:
Ponadto 2) zawiera. i ... oraz 3) pomija pliki takie jak ..foobar, ... barfoo itp.
Mógłbyś użyć,
mv /source/path/{.[!.],..?,}* /destination/path
który obejmowałby pliki pominięte przez 3), ale nadal próbowałby przenieść podkatalogi. Użyciefind
polecenia zmv
poleceniem, jak opisałem powyżej, eliminuje wszystkie te problemy.źródło
Moje rozwiązanie tego problemu, gdy muszę skopiować wszystkie pliki (w tym
.
pliki) do katalogu docelowego, zachowując uprawnienia, to: (nadpisz, jeśli już istnieją)yes
służy do automatycznego nadpisywania plików docelowych,r
rekurencji,v
rozwlekania,p
zachowywania uprawnień.Zwróć uwagę, że ścieżka źródłowa nie kończy się na
/
(więc wszystkie pliki / katalog i. Pliki są kopiowane)Katalog docelowy kończy się na,
/
ponieważ umieszczamy zawartość folderu źródłowego w miejscu docelowym jako całości.źródło
yes
jest to niesamowite polecenie, jeśli chcesz zastąpić pliki docelowe, nie zawsze jest to pożądane. Używaj go tylko wtedy, gdy jesteś pewien, że chcesz to zrobić. Czy istnieje różnica międzyyes | cp ...
icp -f ...
?