Przenieś pliki i zmień własność jednocześnie

23

W systemie Linux (Debian, Ubuntu Mint ...)
Czy jest jakieś polecenie opcji lub coś, czego można użyć do przesłania plików do innego użytkownika bez konieczności:

sudo mv /home/poney/folderfulloffiles /home/unicorn/
sudo chown -R unicorn:unicorn /home/unicorn/folderfulloffiles
Kiwy
źródło

Odpowiedzi:

30

Użyj rsync(1):

rsync \
  --remove-source-files \
  --chown=unicorn:unicorn \
    /home/poney/folderfulloffiles /home/unicorn/
dawud
źródło
4
Dzięki @dawud - to są moje codzienne „rzeczy, których nie znałem i nie rozumiem, jak to przegapiłem”
Jenny D
1
@JennyD warto przyjrzeć usermapi groupmapopcje, jak również.
dawud
2
Ale to nie mvtak, prawda? Tylko kopie? A może mvto?
mikeserv
@mikeserv należycie odnotowano, zobacz moją edycję
dawud
11

Według @Kevin w komentarzach poniżej --file - |pipeskładnia jest zbędna. Więc to usunąłem.

Można to również zrobić za pomocą tar:

sudo tar -C${SRC_DIR} --remove-files --group=unicorn --owner=unicorn -c ./* | 
    sudo tar -C${TGT_DIR} -pvx
mikeserv
źródło
Całkiem pewne, że -f -jest implikowane na obu końcach.
Kevin
1
@Kevin Nie tutaj. Tutaj jest określone.
mikeserv
Tak, podałeś to, ale nie jest to konieczne. Twoje polecenie działa dobrze bez f -części.
Kevin
8
s=/home/poney/; f=folderfulloffiles; d=/home/unicorn/ 
sudo mv $s$f $d && sudo chown -R unicorn:unicorn $d$f

Mniej więcej tyle samo czasu, co inne odpowiedzi, i zauważ, że wszyscy używają tych samych wywołań biblioteki pod maską, wszyscy robią dokładnie to samo - chyba że, jak zauważa Gilles, jest to ten sam system plików i urządzenie , w którym mvto przypadku jest tak naprawdę zmiana nazwy, co czyni go bardziej wydajnym niż rsynclub tar.

Złotowłosa
źródło
To nie jest :zamiast, .gdy masz do czynienia chown?
Kiwy,
2
Hmmm - ciekawe. Tak jest na stronie podręcznika, ale zawsze użyłem kropki. Wygląda na to, że usunęli go ze strony podręcznika GNU około dziesięć lat temu, ponieważ nie jest przenośny POSIX. Nadal działa (z chown z GNU coreutils na Linuksie), ale zmienię to powyżej.
złotowłosa
1
chownzwykle zajmuje zarówno :i ..
slm
1
Możesz to zrobić trochę krócej: nu=unicorn h=/home f=folderfulloffiles ; sudo mv $h/poney/$f $h/$nu/$f ; sudo chown -R ${nu}:$nu $_- choć nie o to chodzi w twojej odpowiedzi, co jest dobre, a ja już głosowałem.
mikeserv
3
Rozwiązanie to ma tę zaletę, że jeśli źródło i miejsce docelowe znajdują się w tym samym systemie plików, plik jest przenoszony, a nie kopiowany, a oryginał usuwany.
Gilles 'SO - przestań być zły'