
我需要刪除具有這些名稱的所有檔案(引號是名稱的一部分):
'index.html?some-query-string'
我嘗試過:
rm \'index.html?*\'
我收到此錯誤:
rm: cannot remove ''\''index.html?*'\''': No such file or directory
答案1
分析
引號是名稱的一部分
你確定嗎?你怎麼知道?有這個現代 GNU 的“特徵”ls
,因此它會列印帶有附加引號的名稱,其中有像?
inside 這樣的字元;因此,當外行人複製貼上'index.html?some-query-string'
並運行時,rm 'index.html?some-query-string'
例如,這將是正確的安全命令。
不幸的是,這可能會讓更精明的用戶感到困惑,他們知道應該引用/轉義某些字符。您的rm
指令 ( rm \'index.html?*\'
) 適用於引號的名稱。由於?*
是 glob 模式,它可能會匹配更多檔案名稱;我認為這就是您想要的,正如您所寫的“我需要刪除所有文件”。該命令給您的事實No such file or directory
讓我相信現有的名稱確實不同。
要確認這一點,請運行ls -N
.如果此命令成功並列印名稱,例如index.html?some-query-string
不含引號然後這些是真實姓名。
解決方案
這部分答案假設您ls
是現代 GNUls
或類似的“智能”,因此有問題的引號不屬於檔案名稱。
要刪除特定文件,請充當'index.html?some-query-string'
在“smart”輸出中看到的完全外行,或者作為在 輸出中ls
看到的需要引用的用戶(我相信您是)。跑步:index.html?some-query-string
ls -N
rm 'index.html?some-query-string'
或者,如果您想刪除名稱以 開頭的所有檔案index.html?
:
rm 'index.html?'*
shell 將刪除引號,它們將無法到達rm
.單引號?
不會被視為通配符,它將按字面意思傳遞rm
。不含引號的*
將被視為通配符,它將匹配任何查詢字串,shell 將可能將多個匹配的檔案名稱作為參數傳遞給rm
.
答案2
如果'
是檔案名稱的一部分,我建議使用 find 指令來" "
傳遞指令的名稱模式。
您可以使用的範例是:
find . -maxdepth 1 -type f -name "'index.html?*'" -exec rm {} \;