假設我有一個/var/log/nginx
受保護的資料夾(由 root 使用者擁有,其他人無法讀取或寫入該資料夾)。即使使用 sudo,我也不能不sudo rm -f /var/log/nginx/ab*
得到“沒有這樣的文件或目錄”。我是否必須實際加載 root shell 才能執行此操作,或者有其他方法嗎?
答案1
原因
shell 解釋並擴展任何全域字元(通配符),例如星號。該命令的這種解釋發生在目前 shell 中(在sudo
執行該命令之前),該 shell 沒有該目錄的讀取權限。由於目前 shell 無法找到與 glob 模式相符的文件,因此不會執行路徑名擴展,並且 shell 將rm
、-f
、 和/var/log/nginx/ab*
(帶有文字星號)作為命令的參數傳遞sudo
。
該sudo
命令依序啟動rm
嘗試刪除路徑為/var/log/nginx/ab*
(星號是 Unix 檔案名稱的合法字元)的檔案的命令。由於這樣的文件實際上並不存在,因此它會報告失敗。對 GNU 來說rm
,這個錯誤訊息是明確的;這滿的下面的錯誤訊息表示要刪除的(單一)檔案不存在:
rm: cannot remove `/var/log/nginx/ab*': No such file or directory
解決方案
解決方案是以超級使用者身分啟動新的 shell,並具有執行檔案名稱擴充所需的權限:
sudo bash -c "rm -f /var/log/nginx/ab*"
上面的命令啟動一個以 root 身分執行的新 shell,並且該-c
選項用於傳遞要由 shell 執行的命令。由於該命令被引用,因此當前 shell 不會解釋星號,而是會原樣傳遞給新的根 shell,從而允許它在啟動命令之前擴展路徑名rm
。
答案2
這要么是您的檔案名稱有問題,要么是檔案名稱中可能存在空格。
因此請嘗試以下解決方法:
嘗試使用前綴
--
來表示選項的結束,例如:sudo rm -vf -- /var/log/nginx/ab*
使用
find
:sudo find /var/log/nginx -name "ab*" -print -delete
如果您認為您的檔案在 Linux 上受到保護,請先嘗試刪除保護:
chattr -i ab*