Перемістіть файли та змініть право власності в той самий час


23

У Linux (Debian, Ubuntu Mint ...)
Чи є якась команда опцій чи щось таке, що я можу використовувати для передачі файлів іншому користувачеві без цього:

sudo mv /home/poney/folderfulloffiles /home/unicorn/
sudo chown -R unicorn:unicorn /home/unicorn/folderfulloffiles

Відповіді:


30

Використання rsync(1):

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

4
Дякую @dawud - це мій щоденний "речі, які я не знав і не можу зрозуміти, як я це пропустив"
Jenny D

1
@JennyD Ви також можете поглянути на варіанти usermapта groupmapваріанти.
dawud

2
Але це не mvтак, правда? Тільки копії? Або mvце?
mikeserv

@mikeserv належним чином зазначив, дивіться мою
редакцію

11

Пер @ Кевін у коментарях нижче, --file - |pipeсинтаксис є зайвим. Так я його зняв.

Це також можна зробити за допомогою tar:

sudo tar -C${SRC_DIR} --remove-files --group=unicorn --owner=unicorn -c ./* | 
    sudo tar -C${TGT_DIR} -pvx

Досить впевнений, що -f -ця мається на увазі з обох кінців.
Кевін

1
@Kevin Не тут. Тут це вказано.
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
Хммм - цікаво. Це так на сторінці man, але я завжди використовував крапку. Схоже, вони зняли його зі сторінки чоловіка GNU близько десяти років тому, тому що це не портативний POSIX. Все ще працює, хоча (з chown від GNU coreutils на Linux), але я зміню це вище.
goldilocks

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
Таке рішення має перевагу в тому, що якщо джерело та пункт призначення є в одній файловій системі, файл переміщується, а не копіюється, а оригінал стирається.
Жиль "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.