刪除名稱以單引號開頭的所有文件

刪除名稱以單引號開頭的所有文件

我需要刪除具有這些名稱的所有檔案(引號是名稱的一部分):

'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-stringls -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 {} \;

相關內容