
我正在運行一個腳本來修復 rsync 後的文件所有權和權限。除了完成任務的最佳方式的問題之外,我想知道是否有一種方法可以chmod
同時運行chown
?
在我的腳本的當前迭代中,我對find
文件進行了兩次處理。
find /var/www/mysite -exec chown www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;
我認為如果我可以使用單一命令更改權限和所有者/群組,那就太好了。經過一番谷歌搜尋後,我驚訝地發現這樣的指令、參數或選項並不存在。
我可以同時更改權限和所有權,以避免find
每個文件兩次?
編輯社群編輯或貼文或其他內容顯示該問題與以下問題重複“使用 1 個命令更改所有資料夾權限”。這個問題是不同的,因為它問的是改變兩個都權限和 所有權同時,不僅僅是權限。
答案1
您可以傳遞多個 exec 命令:
find /var/www/mysite -exec chown www-data:www-data {} \; \
-type f -exec chmod 775 {} \;
答案2
您可以將等效選項新增至rsync
命令:
rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>
您可以對檔案和目錄使用前綴F
in 。--chmod
D
答案3
為了完整性參數也可以在管道中做各種有趣的事。
find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '
這會產生一個檔案名稱流(不是目錄名稱),分隔符號為空,因此處理檔案名稱中的空格。
-0
告訴 xargs 在 null 上分隔輸入。
-I VAR
說用作VAR
“變數名稱”而不是{}
--
它後面的所有內容是每行運行的內容
這可能更具可讀性,但每次執行雙管命令都會啟動新的 shell。
答案4
如果您擔心find
每個檔案兩次,您可能還需要擔心透過 xargs 運行命令組合會產生的分叉數量。
人們常常忘記 perl 具有許多這些基本 shell 指令的等效指令。這是我執行此操作的一種方法(經過測試):
find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'
你必須使用數位uid、gid 和 mode,但請考慮一下:這根本不會分叉(超越一find
和一perl
)。
而且你也不需要了解很多 Perl 來理解它。
chown 和 chmod 已經很清楚了。 與 shell或指令-d
中的相同,且三元運算子不是 perl 所獨有的。 ([
test
foo ? bar : baz
作為獎勵,您可以對目錄和檔案使用不同的模式.)
事實上,如果您是 Perl 新手,則可能需要解釋這些選項。稍微簡化一下:
- 意思
-n
是“為 STDIN 的每一行運行一次,設定$_
為該行” -l
使每行結尾的換行消失(因為否則它會成為 的一部分$_
)-e
認識的人都熟悉sed
;它說這是要評估/運行的表達式。