本篇介紹如何在 Linux 系統上使用 chown 指令,更改檔案或目錄的擁有者與群組設定。

在 Linux 系統上如果想要更改檔案或目錄的擁有者或群組,可以使用 chown 這個指令來處理,以下是 chown 的基本用法以及一些實用的範例程式碼。

基本用法

在 Linux 系統上的檔案與目錄都有擁有者以及群組的屬性質,我們可以透過 ls 的輸出來查看每個檔案與目錄的擁有者與群組:

ls -l

ls 輸出

ls -l 的輸出中,第三欄與第四欄就是檔案或目錄的擁有者與群組名稱,例如這裡的 log 目錄其擁有者就是 root,群組就是 syslog

若要更改某個檔案或目錄的擁有者,可以直接使用 chown 更改:

# 將 myfile 的擁有者改為 myuser
sudo chown myuser myfile

這樣就可以將 myfile 這個檔案的擁有者改為 myuser

如果要更改檔案或目錄的群組,也可以用 chown 更改:

# 將 myfile 的群組改為 mygroup
sudo chown :mygroup myfile

chown 的第一個參數若以冒號開頭,就是代表群組名稱的意思,這一行指令就是將 myfile 這個檔案的群組改為 mygroup

若要同時更改 myfile 的擁有者與群組,可以這樣寫:

# 同時更改擁有者與群組
sudo chown myuser:mygroup myfile

預設的狀況下,chown 在更改檔案的擁有者與群組後,並不會輸出任何訊息(除非出現錯誤),若要讓 chown 明確顯示更改的結果,可以加上 -v 參數:

# 輸出執行結果
sudo chown -v myuser:mygroup myfile

若不想讓 chown 輸出任何錯誤訊息,可以加上 -f 參數:

# 不輸出任何錯誤訊息
sudo chown -f myuser:mygroup myfile

遞迴更改整個目錄

如果要一次修改某個目錄下所有檔案與子目錄的擁有者與群組,可以使用 chown 加上 -R 參數來處理:

# 遞迴更改整個目錄下的所有檔案
sudo chown -R myuser:mygroup myfolder

這樣就會把 myfolder 這個目錄以及其中所有的檔案與子目錄都改成 myuser:mygroup

事先確認擁有者與群組

有時候我們在寫指令稿時,會使用 chown 自動更改檔案或目錄的擁有者與群組,此時我們可以在更改擁有者與群組前,先檢查舊的檔案擁有者與群組,確認舊的擁有者與群組屬性是正確的,才繼續更改其擁有者與群組,如果舊的擁有者與群組屬性不符合預期,就不會進行任何變更,避免程式出錯。

chown--from 參數可以指定舊的擁有者與群組,檢查無誤後才會進行變更:

# 確認舊的擁有者與群組為 root:syslog
sudo chown --from=root:syslog myuser:mygroup myfile

也可以只檢查擁有者或群組:

# 只確認舊的擁有者為 root
sudo chown --from=root myuser:mygroup myfile

# 只確認舊的群組為 syslog
sudo chown --from=:syslog myuser:mygroup myfile

參考檔案的擁有者與群組

如果我們想要把檔案的擁有者與群組改為跟另一個參考檔案一樣,可以使用 --reference 參數:

# 將 myfile 的擁有者與群組改為跟 reffile 一樣
sudo chown --reference=reffile myfile

這樣就會把 myfile 的擁有者與群組改為跟 reffile 一樣。

實用範例

chown 指令本身的用法很單純,不過我們可以結合 Linux 上面的各種指令工具,寫出各種應用的指令稿。

結合 find 指令與 chown 指令,找出目前目錄下所有的 *.c 檔,並將這些檔案的擁有者與群組改為 myuser:mygroup

sudo find ./ -name \*.c -exec chown myuser:mygroup {} \;

關於 find 指令的用法,可以參考 Unix/Linux 的 find 指令使用教學、技巧與範例整理

參考資料:HowtoForge