使用 ????????? 修復文件權限

使用 ????????? 修復文件權限

我編寫了一個腳本來更改目錄中所有檔案的權限:

#!/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)讓他們中的許多人恢復了相對正常,但許多人仍然嚴重腐敗。我相信這是由於硬體問題(從磁碟上取出好文件,然後扔掉它)。

相關內容