同時 chmod 和 chown ?

同時 chmod 和 chown ?

我正在運行一個腳本來修復 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>

您可以對檔案和目錄使用前綴Fin 。--chmodD

答案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 所獨有的。 ([testfoo ? bar : baz作為獎勵,您可以對目錄和檔案使用不同的模式.)

事實上,如果您是 Perl 新手,則可能需要解釋這些選項。稍微簡化一下:

  • 意思-n是“為 STDIN 的每一行運行一次,設定$_為該行”
  • -l使每行結尾的換行消失(因為否則它會成為 的一部分$_
  • -e認識的人都熟悉sed;它說這是要評估/運行的表達式。

相關內容