Przenieś pliki i foldery rekurencyjnie w systemie Linux

75

Rozważać:

ls -al ../public-back
drwxrwxr-x  4 apache   apache     4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x  2 apache   apache    4096 Apr 19 03:33 content
drwxrwxr-x  2 apache   apache   20480 Apr 20 06:14 images
drwxrwxr-x  2 apache   apache    4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x  4 apache   apache     4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 content
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 images
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 video

Jak przenieść zawartość /public-back/templatesrekurencyjnie z uprawnieniami /public/templates?

siliconpi
źródło
mv ../public-back/templates/* public / templates /
mv -R ../public-back/templates/* public/templates/Nadal głosowałbym za przeniesieniem pytania.
2
mv: nieprawidłowa opcja - R @Vladislav Zorov
3
zrobiłem cp -a ../public-back/templates/ public /

Odpowiedzi:

92

O ile nie rozumiem pytania, zadziałałoby to:

mv /public-back/templates/* /public/templates

Ponadto, chyba że masz ogromną listę plików, dodawanie -ipoprosi przed zastąpieniem czegokolwiek, co zwiększy bezpieczeństwo podczas używania symboli wieloznacznych, takich jak *.

KennyPeanuts
źródło
14
Nie przenosi ukrytych plików.
Arda
2
Zobacz askubuntu.com/a/259386/358964, aby dowiedzieć się, jak ustawić dotglob, aby ukryte pliki również były przenoszone.
mkobit,
3
Uwaga: nie spowoduje to zastąpienia plików w podkatalogach. Dostaniesz Directory not emptywiadomość.
Armstrongest
Wydaje się, że spłaszczyło hierarchię katalogów. Nie zachowałem dla mnie folderów w oryginalnym folderze. Wszystkie pliki znalazły się w tym samym folderze, zamiast dosłownie przenosić oryginalny folder o tej samej strukturze.
Robert Noack
To rozwiązanie działa, ale jeśli widzisz błąd: mv: target '/public/templates' is not a directorywystarczy utworzyć folder docelowy ręcznie: mkdir /public/templates.
Ali Shabdar
8

Strona man dla cp stwierdza:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

Próbować;

cp -rp /public-back/templates/* /public/templates/
Himalaj
źródło
13
mvjest do przeniesienia , natomiast cpdo kopiowania - rozróżnienie semantyczne / etymologiczne.
Marius Butuc
cpjest znacznie wolniejszy niż mv. cpzmusza komputer do skopiowania wszystkiego z dysku do pamięci RAM, a następnie zapisania go ponownie na dysk, co może zająć dużo czasu w zależności od rozmiaru plików. Jednak mvzawsze dzieje się to natychmiast, ponieważ tylko linki muszą zostać przepisane.
tjespe
4

Podczas przenoszenia elementów z pendrive'a na system OSMC znalazłem następujące bardzo przydatne:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

Wyjaśnienie, jak to działa poniżej.

BTW, nie zapomnij dodać ukośnika odwrotnego przed spacjami w nazwach katalogów źródłowych lub docelowych (patrz wyżej).

find  finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec     Executes a command, in our case mv

-v        Verbose, so you can see what's happening (optional)

{}        is replaced by the name of the found object.

W efekcie znajdujesz wszystkie pliki i wszystkie foldery i przenosisz je jeden po drugim (lub jeśli katalog zostanie znaleziony jako pierwszy, przenosisz ten katalog i zawartą w nim zawartość). To rozpoczyna nowy proces dla każdego ruchu i jest bardzo nieefektywne. Używaj tego tylko, gdy zwykłe polecenia zawodzą.

Pi Hard
źródło
2

mv chyba tego nie robi. Ale możesz użyć tej małej sztuczki, działa jak urok:

tar cf - . |(cd /targetdir; tar xvf -)

i zachowuje uprawnienia i wszystko.

Uwaga: żadne z powyższych nie działało dla mnie, dlatego to obejście.

svye
źródło
1
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

Utwórz twarde linki w katalogu docelowym i usuń katalog źródłowy. „mv” po prostu nie będzie działać w twoim przypadku i ogólnie działa tylko wtedy, gdy źródła dir i dest nie mają wspólnych poddrzewa.

Zauważ, że zakładam, że słowo „move” w pytaniu oznacza, że ​​katalog źródłowy powinien zniknąć po operacji.

Boudewijn
źródło