Bagaimana saya bisa mengubah semua file milik satu pengguna ke pengguna lain?

39

Saya mencari perintah Linux yang dapat mengubah kepemilikan semua file milik pengguna tertentu, lebih disukai di direktori yang ditargetkan, ke pengguna tertentu lainnya.

Perintah mimpi saya akan terlihat seperti ini ...

chuser -R --olduser tom --newuser jerry

atau

chuser -R --olduser 1066 --newuser 1492

Ini adalah skenario saya ... Saya punya file cadangan (.tgz) dengan informasi pengguna dan grup tersimpan di dalamnya. Itu diambil dari server web yang menjalankan Apache dan MySQL. File dalam cadangan berasal dari seluruh sistem dan berisi file dari beberapa pengguna yang berbeda dan beberapa akun jenis sistem dan itu adalah kunci bahwa ketika dikembalikan ke server baru pengaturan tidak hilang. Masalahnya adalah bahwa pengguna pada mesin file sedang dipulihkan untuk tidak cocok dengan yang ada di file cadangan. Misalnya kedua mesin memiliki pengguna MySQL tetapi mereka memiliki id pengguna yang berbeda dan ada beberapa id pengguna yang ada di kedua mesin milik pengguna yang berbeda. Ini berarti tidak ada cara untuk menyinkronkan pengguna di mesin baru dengan yang di mesin lama.

Saya dapat menemukan semua file pengguna dengan perintah find seperti ini ...

find /decompressed-backup-dir -uid 1050

atau

find /decompressed-backup-dir -user tom

Jika, seperti yang saya duga, tidak ada cara untuk melakukan apa yang saya inginkan dengan satu perintah maka mungkin ada cara untuk menyalurkan hasil dari perintah find ke perintah lain untuk menangani perubahan kepemilikan?

Saya bisa melakukan ini dengan skrip PHP tetapi ada 4GB dan puluhan ribu file dalam cadangan jadi saya tidak ingin menggunakan PHP atau Perl tetapi saya akan senang dengan skrip shell yang bisa mengatasinya.

Burung hantu malam
sumber

Jawaban:

30

Sesuatu seperti

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Ben Voigt
sumber
1
bukannya -uidsaya menggunakan-user
alexandre1985
65

Saya pikir flag --from pada perintah chown mungkin adalah cara termudah.

chown --from=oldguy newguy * -R
SiteKickr
sumber
3
Solusi terbaik, tidak perlu menemukan cinta itu
Tobias Hagenbeek
2
Solusi optimal
Karl Forner
1
pada OS X Anda dapat melakukan ini dengan brew install coreutilsdan gchown.
jomo
Ini jawaban yang benar dan terbaik.
George M
Saya mengkonfirmasi, itu harus ditandai sebagai jawaban terbaik.
Soullivaneuh
7

Menambahkan ke jawaban oleh SiteKickr , chgrptidak memiliki --fromargumen, tetapi Anda dapat mencapai hal yang sama dengan chownmenghilangkan pengguna.

Contoh:

chown -R --from=:currentgroup :newgroup /some/directory
TheBigB
sumber
6

Anda dapat menggunakan find, seperti yang diposting orang lain, untuk melakukannya chown.

Namun, Anda mungkin tidak perlu karena tarakan mengurus hal-hal untuk Anda.

Misalnya, jika Anda membuat tardi machine Amana pengguna tomberada uid 500dan kemudian untarfile di machine Bmana pengguna tomberada uid 505, tarakan melakukan hal yang benar dan membuat file miliknya uid 505.

Ciclamino
sumber
Berita gembira yang menarik, saya tidak menyadari hal ini. Jadi tar tidak hanya menyimpan uid tetapi juga nama yang terkait dengan uid.
Nicholi
3
Format tar asli hanya menyimpan informasi numerik. Format UStar, diperkenalkan oleh POSIX di akhir 80-an, menambahkan nama. Jadi hampir semua tar yang Anda temui hari ini melakukan hal yang benar.
Ciclamino
1

The jawaban set kedua pengguna dan kelompok:

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

tetapi jika Anda ingin mengubah HANYA sekelompok file milik beberapa pengguna Anda tidak dapat menggunakan chown(sejauh yang saya tahu), tetapi sebaliknya gunakan chgrp:

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

dan untuk mengubah HANYA sekelompok file milik beberapa kelompok yang harus Anda gunakan misalnya .:

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

Sekadar menambah ilmu.

Timo Kähkönen
sumber
1
Sebenarnya, Anda bisa meninggalkan newuserbagian itu. Halaman manual mengatakan: "Jika titik dua dan grup diberikan, tetapi pemiliknya dihilangkan, hanya grup file yang diubah; dalam hal ini, chownlakukan fungsi yang sama dengan chgrp."
Ben Voigt
0

Jika Anda perlu memetakan ID kepemilikan lama / baru secara rekursif yang diselesaikan untuk /etc/passwdpengguna yang sama ,

(yang bisa terjadi setelah Anda memperkenalkan LDAP ke server dan /etc/passwdmemiliki entri duplikat untuk setiap pengguna dan grup),

Anda dapat menggunakan skrip ini yang saya tulis: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Ini menciptakan pemetaan sendiri. Sayangnya, antarmuka program ada dalam kode. Tambahkan beberapa pernyataan debug jika Anda perlu menyelidiki bagaimana ia melakukan apa. Tapi itu cukup banyak chown dimuliakan dengan pemetaan yang dibuat dari duplikat di/etc/passwd . Jika ini berguna bagi siapa pun, itu akan sangat keren. :)

galva
sumber
-2

Anda dapat gunakan chown - R /directory/file

Perintah ini akan mengubah izin untuk semua instance direktori chown - R /directory

Mansur
sumber