我編寫了一個腳本來更改目錄中所有檔案的權限:
#!/bin/bash
files=`find "$1"`
for f in $files; do
chown "$2" "$f"
chmod 600 "$2"
done
顯然, chmod 的第二個參數應該要"$f"
代替"$2"
。但是,當我運行腳本(在一個小目錄上)時,我也忘記包含第二個參數,它應該是"dave:dave"
.現在,目錄中的所有檔案都完全亂了:
~ $ ll Documents/
ls: cannot access Documents/wiki.txt: Permission denied
ls: cannot access Documents/todo.txt: Permission denied
ls: cannot access Documents/modules.txt: Permission denied
ls: cannot access Documents/packages.txt: Permission denied
total 0
-????????? ? ? ? ? ? modules.txt
-????????? ? ? ? ? ? packages.txt
-????????? ? ? ? ? ? todo.txt
-????????? ? ? ? ? ? wiki.txt
運行sudo chown dave:dave Documents/*
並sudo chmod 600 Documents/*
不會引發任何錯誤,但文件保持不變。我知道我可以將sudo cat
每個文件放入一個新文件中,但我很好奇如何修復原始文件的權限。
答案1
除了註釋中給出的答案之外,您還應該注意,您的腳本將在任何包含空格的檔案名稱上中斷。
您可以使用單一命令來完成所有這些操作find
,而不是嘗試解析從 輸出的檔案名稱清單find
。更加堅固;處理檔案名稱而不考慮特殊字元或空格。
find "$1" -type f -exec chown "$2" {} \; -exec chmod 600 {} \;
請注意,如果chown
在給定文件上失敗,則chmod
不會在該文件上運行。無論如何,這可能是您想要的行為。
由於您已經執行了錯誤的命令,從「文件」目錄中刪除了執行權限,因此您需要重新新增執行權限:
chmod u+x Documents
如果有更多目錄被錯誤地刪除了執行權限,您應該能夠使用以下方法修復它們:
find Documents -type d -exec chmod u+x {} \;
不過,我認為您不需要這個,因為一旦從“文檔”中刪除了執行權限,那麼它的所有子目錄都將不可訪問,因此不會從其中刪除執行權限。
答案2
有一次我看到具有如此奇怪權限的文件,是在嚴重地文件系統搞亂了。一輪融資fsck(8)
讓他們中的許多人恢復了相對正常,但許多人仍然嚴重腐敗。我相信這是由於硬體問題(從磁碟上取出好文件,然後扔掉它)。