這個「尋找所有 vim 交換檔案並透過確認刪除它們」指令有什麼問題?

這個「尋找所有 vim 交換檔案並透過確認刪除它們」指令有什麼問題?

我正在嘗試刪除所有 vim 交換文件*.swp並透過確認刪除它們。該find命令找到了文件,但rm帶有No such file or directory選項-i。當我對文件的路徑進行硬編碼並使用rm -i時,它似乎可以工作。

見下文

(doors)hobbes3@hobbes3 ~/Sites $ find mysite mysite_BAK -name *.swp -exec 'rm -i {}' \;
find: rm -i mysite/templates/.base.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.create.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.detail.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.list.html.swp: No such file or directory
(doors)hobbes3@hobbes3 ~/Sites $ rm -i mysite/templates/.base.html.swp 
remove mysite/templates/.base.html.swp? n

我想我的選項做錯了-exec。有什麼建議麼?先致謝!

答案1

該錯誤是由尋找, 不是R M

原因是你已經寫了它,所以'rm -i <file>'是單一參數。這將被重寫:

find mysite mysite_BAK -name '*.swp' -exec rm -i '{}' \;

因此 find 在「-exec」之後取得多個參數,並將第一個參數視為命令,其他參數視為命令參數。

答案2

更新的答案:

如果您使用的是 bash 版本 >4.0,您可以使用 globstar 功能,這非常簡單:

shopt -s globstar
rm -i **/*.swp

這也適用於包含空格的檔案名稱!

該部分將啟動bash 中的shopt -s globstar遞歸匹配。**你可以把它放在你的身上.bashrc,永遠幸福。

舊答案:

我通常發現組合使用簡單的工具會更容易

cd 到 dir 然後:

rm -i `find . | grep .swp$`

它更容易記住(如果性能不是問題)!

警告:僅當您的檔案名稱不包含空格時才使用此選項。

答案3

在你的情況下,我會跑,

find mysite mysite_BAK -type f -name .\*.sw? -exec rm -i {} ";"

VIM 的交換檔案不只以 .swp 結尾。如果 .swp 存在,VIM 將建立 .swo,然後是 .swn,依此類推。此外,交換檔案以點 (.) 為前綴,例如 .file1.rb.swp

其他無需確認(-i)即可尋找並刪除 VIM 交換文件的方法:

find some_dir -type f -name .\*.sw? | xargs rm 
find some_dir -type f -name .\*.sw? -exec rm {} ";"
find some_dir -type f -name .\*.sw? -delete  # -delete option does not work in Git Bash

如果沒有“-type f”,刪除目錄時會出現錯誤。此外,\in.\*.sw?也使其相容於多個平台。

相關內容