Przenieś zawartość folderu o jeden poziom wyżej


127

Mam katalog, który jest rozpakowany, ale znajduje się w folderze. Jak mogę przenieść zawartość o jeden poziom wyżej? Uzyskuję dostęp do CentOS przez SSH.

Odpowiedzi:


189

W przypadku folderu o nazwie „mój folder” i wyższego poziomu w hierarchii plików (punkt, w którym chcesz go umieścić), polecenie brzmiałoby:

mv myfolder/* .

Na przykład, jeśli dane były w /home/myuser/myfolderśrodku, /home/myuser/uruchom polecenie.


35
Konieczne może być dopasowanie .*nie tylko *wtedy, gdy archiwum zawiera pliki kropkowe. Dodaj również `&& rmdir myfolder` na końcu, aby usunąć niepotrzebny folder. Jest to zapisywane, ponieważ będzie działać tylko wtedy, gdy mv zwróci sukces ORAZ ponieważ rmdir nie usunie niepustego katalogu.
Caleb

Dobra uwaga na temat .*. Usunięcie oryginalnego folderu jest trywialne i nie jest wymagane, więc pozwolimy OP sobie z tym poradzić.
Rudu

1
@Caleb możliwe jest zarówno pisać *i .*w jednej linii? tylko ciekawość
Richard

2
@ Richard Tak, to prawda. Wszystkie argumenty mvbędą źródłami oprócz argumentu LAST, który musi być celem przenoszenia (w przypadku wielu źródeł musi to być folder).
Caleb

1
Dostaję bash:/bin/mv: Argument list too long
dragosrsupercool

26

Żeby było jasne, wzięte z powyższej odpowiedzi Rudu i komentarzy.

Jeśli chcesz przenieść całą zawartość, W TYM pliki zaczynające się od. (takich jak .htaccess, .git itp.), musisz uwzględnić w poleceniu zarówno *, jak i *. Tak jak:

 mv subfolder/* subfolder/.* .

Spowoduje to przeniesienie zawartości podfolderu do bieżącego folderu. Zwróć uwagę na spację przed ostatnim „.”.


to działa, ale dostaję mv: rename fake/. to ./.: Invalid argumentimv: rename fake/.. to ./..: Invalid argument
Maslow

16

Jest to możliwe przy użyciu następujących metod:

  • Używanie rsync:

    rsync -vua --delete-after foo/ .
  • Korzystanie cpi rmdir:

    cp -vaR foo/. . && rmdir foo/
  • Używając mv(z dotglobwłączoną opcją):

    shopt -s dotglob # Includes filenames beginning with a dot.
    mv -- foo/* .    # Where foo/ is the folder consisting the files.
    shopt -u dotglob # Disables previously enabled dotglob option.

    gdzie foo/jest twój folder, którego zawartość ma zostać przeniesiona o jeden poziom wyżej.

    Zobacz: help shopti man bash.

  • Za pomocą mv(jak sugerowano tutaj ):

    mv foo/* foo/.[^.]* . && rmdir foo/

    Uwaga: pominąłby plik o nazwie foo/..bar...

    Uwaga: Do powłok POSIX potrzebujesz [!.].


Jakie są przełączniki rsync -v, -u, -ai -rrobi? AFAICT, -vjest pełne, co powoduje, że rsync drukuje więcej informacji. -uoznacza aktualizację - skopiuj plik tylko wtedy, gdy jest nowszy. To nie wydaje się istotne. -aoznacza archiwum. Spowoduje to skopiowanie właściciela i uprawnień do pliku, a synchronizacja będzie rekurencyjna. -roznacza rekurencyjny, ale już to obejmuje -a.
rjmunro

-ujest przydatny, gdy nie chcesz tracić dodatkowego czasu na przenoszenie danych, które już tam są (szczególnie w przypadku powolnych urządzeń pamięci masowej). Usunąłem -r, ponieważ jest objęty, -ajak wspomniałeś.
kenorb

1
mv foo/* foo/.[^.]* .pominąłby foo/..bar..na przykład plik o nazwie . Zauważ, że do powłok POSIX potrzebujesz [!.].
Stéphane Chazelas,

Należy wspomnieć, że rsync -vua --delete-after foo/ .usuwa wszystko, co może już istnieć w bieżącym katalogu.
David

7

po prostu wydaj polecenie mv

mv (directory)/* .

jeśli chcesz usunąć katalog, dodaj

rm -rf (directory)

Zakładając, że znajdujesz się w katalogu nadrzędnym (katalog)

Jeśli jesteś w (katalogu), to

mv * ../

13
Dodatkowa wskazówka dotycząca bezpieczeństwa: usuwając katalog, o którym wiesz, że powinien być pusty, rmdirnarzeka i wychodzi, jeśli katalog nie jest pusty, a rm -rzamiast tego po prostu usunąłby go i całą jego zawartość. (To poka-jarzmo .)
Anko

Świetny punkt! Nie mogę wymyślić powodu, aby tego nie robić.
Mark Lalor

@MarkLalor Jednym z powodów może być obecność ukrytych plików, takich jak wszechobecne .DS_storew macOS. Powyższe mvpolecenie nie przenosi ich (bez dotglobzestawu).
AkselA

0

dla tych z was na wspólnym serwerze musielibyście użyć czegoś takiego

Aby przenieść pliki

mv -v ~/public_html/public_html/* ~/public_html/

Aby skopiować pliki

cp -a ~/public_html/public_html/* ~/public_html/


2
Powyższe pytanie dotyczy przenoszenia, a nie kopiowania treści. Spowodowałoby to zduplikowanie plików przez pozostawienie oryginałów w podfolderze. Bycie „współdzielonym” serwerem, ale tak naprawdę nie ma z tym nic wspólnego.
Caleb

1
masz rację, a oto odpowiedź na to ...
Ricardo Havoc

2
Co do twojej edycji: jak to się różni od już ocenionej odpowiedzi ? A co ma z tym wspólnego „serwer współdzielony”? Proszę edytować wyjaśnić te przedmioty, jeśli ten będzie użyteczny wkład, jaki wnosi wartość dodaną do tego, co jest już tutaj.
Caleb

1
Nie zgadzam się z tym, że serwer współdzielony nie ma z tym nic wspólnego. Sposób, w jaki wprowadzany jest „reż”, robi różnicę.
Ricardo Havoc

1
koleś, dlaczego jesteś taki wściekły? ... wow .. Właśnie dzieliłem się małą wiedzą. Wszyscy rozumiemy inaczej i inaczej stawiamy czoła różnym problemom technicznym ... Miłego dnia Caleb ..
Ricardo Havoc
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.