Перемещать файлы и менять владельца одновременно

23

В Linux (Debian, Ubuntu Mint ...),
есть ли какая-либо опция команды или что-то, что я могу использовать для передачи файлов другому пользователю без необходимости делать:

sudo mv /home/poney/folderfulloffiles /home/unicorn/
sudo chown -R unicorn:unicorn /home/unicorn/folderfulloffiles
Kiwy
источник

Ответы:

30

Используйте rsync(1):

rsync \
  --remove-source-files \
  --chown=unicorn:unicorn \
    /home/poney/folderfulloffiles /home/unicorn/
Дауд
источник
4
Спасибо @dawud - это мой ежедневный «материал, который я не знал и не могу понять, как я его пропустил»
Дженни Д.
1
@JennyD вы можете принять взглянуть на usermapи groupmapварианты , а также.
Дауд
2
Но это не mvтак, верно? Только копии? Или это mvтак?
mikeserv
@mikeserv должным образом отметил, см. мое редактирование
Дауд
11

Согласно @Kevin в комментариях ниже, --file - |pipeсинтаксис является избыточным. Итак, я удалил это.

Это также можно сделать с помощью tar:

sudo tar -C${SRC_DIR} --remove-files --group=unicorn --owner=unicorn -c ./* | 
    sudo tar -C${TGT_DIR} -pvx
mikeserv
источник
Уверен, что -f -подразумевается на обоих концах.
Кевин
1
@ Кевин Не здесь. Здесь это указано.
mikeserv
Да, вы указали это, но это не обязательно. Ваша команда отлично работает без f -части.
Кевин
8
s=/home/poney/; f=folderfulloffiles; d=/home/unicorn/ 
sudo mv $s$f $d && sudo chown -R unicorn:unicorn $d$f

Примерно той же длины, что и остальные ответы, и обратите внимание, поскольку все они используют одни и те же библиотечные вызовы изнутри, они все делают одно и то же - если, как отмечает Жиль, это происходит на одной и той же файловой системе и устройстве , в этом случае mvдействительно переименование, что делает его более эффективным, чем rsyncили tar.

лютик золотистый
источник
Это не :вместо того, .когда иметь дело с chown?
Kiwy
2
Хммм - интересно. Это так на странице руководства, но я всегда использовал точку. Похоже, что они удалили его из справочной страницы GNU около десяти лет назад, потому что это не POSIX переносимый. Хотя все еще работает (с chown из GNU coreutils на linux), но я изменю это выше.
Златовласка
1
chownкак правило, принимает оба :и ..
SLM
1
Вы могли бы сделать это немного короче: nu=unicorn h=/home f=folderfulloffiles ; sudo mv $h/poney/$f $h/$nu/$f ; sudo chown -R ${nu}:$nu $_- хотя это вряд ли смысл вашего ответа, что хорошо, и я уже проголосовал.
mikeserv
3
Преимущество этого решения заключается в том, что если источник и место назначения находятся в одной файловой системе, файл перемещается, а не копируется, а исходный файл стирается.
Жиль "ТАК - перестань быть злым"