2013-11-02 69 views
30

爲什麼不這項工作,我想所有的文件更改爲644 ABD所有-d爲755:找。 -type f -exec chmod 644 {};

find . -type f -exec chmod 644 {} ; 

我得到:發現:缺少參數`-exec」 感謝

+4

終止與'\;'不' ;單獨。 –

+3

...這是因爲'-exec'之後的所有內容都被視爲它的參數。如果你有一個空的';'它將被視爲整個'find'的終結符,但實際上你需要終止'exec',所以它必須作爲參數字符串的一部分被轉義。 –

+0

可能重複的[如何在Linux Ubuntu終端中設置文件夾及其所有子文件夾和文件的chmod?](http://stackoverflow.com/questions/3740152/how-to-set-chmod-for-a-文件夾和所有其子文件夾和文件在Linux中的ubunt) –

回答

11

一個很好的選擇是這樣的:

find . -type f | xargs chmod -v 644 

和目錄:

find . -type d | xargs chmod -v 755 

,並更加明確:

find . -type f | xargs -I{} chmod -v 644 {} 
+0

如何處理找到的文件,有空格?我收到錯誤,文件的名稱被空格分割,並且它試圖爲每個分割的部分運行chmod。 – Lidia

+0

@Lidia,嘗試使用添加'-print0'選項來查找和'xargs -0'。 – TAllieri

+0

@TAllieri非常感謝 – Lidia

90

管道到xargs的是這樣做,可以發現裏面做的一個骯髒的方式。

find . -type d -exec chmod 0755 {} \; 
find . -type f -exec chmod 0644 {} \; 

您可以更加有其他的選擇,比如控制:

find . -type d -user harry -exec chown daisy {} \; 

你可以做一些非常酷的事情發現,你可以做一些非常危險的事情了。看看「男人找」,它很長,但值得快速閱讀。並且,一如既往地記住:

  • 如果您是root用戶,它將成功。
  • 如果你在根(/),你將有一個糟糕的一天。
  • 使用/ path/to /目錄可以使事情變得更安全,因爲您明確定義了希望運行的位置。
+2

爲什麼xargs方法是一種「骯髒的方式」?它只有一次運行chmod的巨大優勢,所有文件都是參數。 「-exec chmod」方法將爲每個文件創建一個子進程。 –

+0

如果你只想運行一次chmod,那麼把它改爲'find。 -type f -exec chmod 0644 {} +'與xargs方法基本相同,構建一個命令行。 (\以上只是爲了逃避分號。) – johnthacker

+0

快速鏈接:'find。 -type d -exec chmod 0755 {} \; && 找 。 -type f -exec chmod 0644 {} \;' – lucaferrario

1

我需要這經常是我在~/.bashrc文件中創建一個函數:

chmodf() { 
     find $2 -type f -exec chmod $1 {} \; 
} 
chmodd() { 
     find $2 -type d -exec chmod $1 {} \; 
} 

現在我可以使用這些快捷鍵:

chmodd 0775 . 
chmodf 0664 .