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

Odpowiedzi:


30

Użyj rsync(1):

rsync \
  --remove-source-files \
  --chown=unicorn:unicorn \
    /home/poney/folderfulloffiles /home/unicorn/

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

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.


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'
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.