Как я могу изменить все файлы, принадлежащие одному пользователю другому пользователю?

39

Я ищу команду Linux, которая может изменить владельца всех файлов, принадлежащих данному пользователю, предпочтительно в целевом каталоге, другому указанному пользователю.

Команда моей мечты будет выглядеть примерно так ...

chuser -R --olduser tom --newuser jerry

или

chuser -R --olduser 1066 --newuser 1492

Это мой сценарий ... У меня есть резервный файл (.tgz) с информацией о пользователях и группах. Он был взят с веб-сервера под управлением Apache и MySQL. Файлы в резервной копии находятся по всей системе и содержат файлы от нескольких разных пользователей и нескольких учетных записей системного типа, и важно, чтобы при восстановлении на новом сервере настройки не терялись. Проблема в том, что у пользователей на машине файлы восстанавливаются, чтобы не совпадать с теми, что в файле резервной копии. Например, на обеих машинах был пользователь MySQL, но у них разные идентификаторы пользователей, и на обеих машинах было несколько идентификаторов пользователей, принадлежащих разным пользователям. Это означает, что нет возможности синхронизировать пользователей на новом компьютере с пользователями на старом компьютере.

Я могу найти все файлы пользователей с помощью команды find, как это ...

find /decompressed-backup-dir -uid 1050

или

find /decompressed-backup-dir -user tom

Если, как я подозреваю, нет способа сделать то, что я хочу, с помощью одной команды, то, возможно, есть способ передать результаты команды find другой команде для обработки изменения владельца?

Я мог бы сделать это с помощью скрипта PHP, но в резервной копии есть 4 ГБ и десятки тысяч файлов, поэтому я не хочу использовать PHP или Perl, но я был бы рад сценарию оболочки, который мог бы справиться с этим.

Ночная Сова
источник

Ответы:

30

Что-то типа

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Бен Фойгт
источник
1
вместо этого -uidя использовал-user
alexandre1985
65

Я думаю, что флаг --from в команде chown, вероятно, самый простой способ.

chown --from=oldguy newguy * -R
SiteKickr
источник
3
Лучшее решение, не нужно его любить
Тобиас Хагенбек
2
Оптимальное решение
Карл Форнер
1
на OS X вы можете сделать это с brew install coreutilsи gchown.
Джомо
Это правильный и лучший ответ.
Джордж М
Я подтверждаю, это должно быть помечено как лучший ответ.
Soullivaneuh
7

Добавление к ответу SiteKickr , chgrpне имеет --fromаргумента, но вы можете добиться того же с chownопущением пользователя.

Пример:

chown -R --from=:currentgroup :newgroup /some/directory
TheBigB
источник
6

Вы можете использовать find, как кто-то еще написал, чтобы сделать chown.

Тем не менее, вам, возможно, не придется, так как tarпозаботятся о вас за вас.

Например, если вы сделаете tarна machine Aкотором пользователь tomнаходится , uid 500а затем untarфайл на machine Bкотором пользователь tomнаходится uid 505, tarбудет делать правильные вещи и сделать файлы , принадлежащие uid 505.

Ciclamino
источник
Интересный лакомый кусочек, я не знал об этом. Таким образом, tar хранит не только UID, но и имя, связанное с UID.
Николи
3
Исходный формат tar хранит только числовую информацию. Формат UStar, представленный POSIX в конце 80-х, добавляет названия. Так что почти любая смола, с которой вы сталкиваетесь в эти дни, делает правильные вещи.
Цикламино
1

Ответ устанавливает оба пользователя и группу:

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +

но если вы хотите изменить ТОЛЬКО группу файлов, принадлежащих какому-либо пользователю, вы не можете использовать chown(насколько я знаю), но вместо этого используйте chgrp:

find /decompressed-backup-dir -uid 1050 -exec chgrp newgroup {} +

и изменить ТОЛЬКО группу файлов, принадлежащих какой-либо группе, которую вы должны использовать, например:

find /decompressed-backup-dir -gid 400 -exec chgrp newgroup {} +

Просто чтобы добавить знания.

Тимо Кяхконен
источник
1
На самом деле, вы можете просто пропустить newuserчасть. На странице руководства написано: «Если дано двоеточие и группа, но владелец не указан, изменяется только группа файлов; в этом случае chownвыполняет ту же функцию, что и chgrp».
Бен Фойгт
0

Если вам нужно рекурсивно сопоставить старые / новые идентификаторы владения, которые разрешаются одному и тому же /etc/passwdпользователю ,

(что может произойти после того, как вы внедрили LDAP на сервер и в нем /etc/passwdесть повторяющиеся записи для каждого пользователя и группы),

Вы можете использовать этот скрипт, который я написал: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Он создает отображение самостоятельно. Интерфейс программы, к сожалению, в коде. Добавьте несколько операторов отладки, если вам нужно выяснить, как и что он делает. Но это в значительной степени прославленный чоун с отображением, созданным из дубликатов/etc/passwd . Если это кому-нибудь пригодится, это было бы здорово. :)

Galva
источник
-2

Вы можете использовать chown - R /directory/file

Эта команда изменит разрешение для всех экземпляров каталога chown - R /directory

Мансур
источник