有沒有一種簡單的方法來預覽 rm 將刪除的文件?
有沒有一種簡單的方法來評估給定
rm
命令在您不理解時會做什麼(例如不認識標誌、變數等如何互動)?雖然
ls
有助於擷取rm
參數中的問題,ls -abc XYZ
但不會列出受rm -abc XYZ
. 理想情況下,我想輸入類似的previewrm -abc XYZ
內容並查看將被刪除的內容而不實際刪除任何內容,包括使用-f
標誌。我基本上想
rm
在測試批處理模式下執行。也就是說,我想看看如果它真正執行會採取什麼行動,最好完全不碰它。因此,testout 'rm -abc XYZ'
可能是真正的理想。
簡單的方法是使用
rm -i
@orion 描述的方式。如果你想要一些不會刪除任何東西但不會調整 rm 標誌的東西,你總是可以建構你自己的版本,rm
我們稱之為preview-rm
. 這真的很簡單,你甚至可以在不接觸實際rm
源文件的情況下做到這一點:
- 查找系統版本的原始碼
rm
。您可能需要下載源包或其他任何東西。GNUrm
是“核心實用程序”的一部分,由兩個 C 文件、rm.c
和remove.c
、以及幾個標頭檔組成。一旦設置好編譯系統實用程序,剩下的就很簡單了。mockrm.c
使用以下內容創建文件。唯一重要的部分是某些版本的rm
目錄通過嘗試unlink()
並檢查錯誤來檢測目錄,因此我們需要確保它正常工作:#include <stdio.h> #include <sys/stat.h> #include <errno.h> int unlink(char *s) { struct stat sbuf; lstat(s, &sbuf); /* Simulate unlink error if we're asked to unlink a directory. */ if (S_ISDIR(sbuf.st_mode)) { return EISDIR; } puts(s); return 0; } int rmdir(char *d) { printf("%s (dir)\n", d); return 0; }
- 最後,像這樣編譯你的
preview-rm
執行檔:% cc rm.c remove.c mockrm.c -o preview-rm
中的函式
mockrm.c
將優先連結到 C 庫提供的系統呼叫,為您提供rm
可用於預覽的無牙複製。(在將其指向重要文件之前,請測試它是否真的有效。)**替代方案:**如果您使用的系統支持該
LD_PRELOAD
功能(OS X 不支持),您可以通過將 mockrm.c 編譯到共享庫(:.so``rm
% LD_PRELOAD=/path/to/mockrm.so rm -flags files
但是,既然您無論如何都需要更改命令呼叫,為什麼不只創建一個單獨的執行檔,如上所示。
rm
我知道將真實文件指向有價值的文件會有點緊張(**編輯:**如果您更新作業系統,則必須再次測試並確保rm
沒有以禁用包裝器的方式進行更改。)
您可以使用
rm -i
它來提示您將刪除的每個文件。您可以no
使用該命令重複(令人困惑地)輸入它yes
,以查看提示(拒絕所有提示):yes no | rm -i files/globs/options
編輯以回應@user63051 的評論
如果您擔心危險的標誌組合,您可以指定
rm -i --
,之後的任何內容都不會被視為選項。這當然意味著要使-r
標誌起作用,您需要將其放在--
.如果您想嘗試,另一個建議是創建一個
dummy
不屬於任何現有組的使用者。如果others
您的文件的權限不包含write
權限(除非您特別需要,否則它們通常不包含),您可以以其他使用者 (su dummy
) 的身份登錄並執行rm
命令。它無權刪除任何內容,因此只會抱怨它。您也可以這樣做以使用上面的建議(作為雙重保護)。我應該警告你,所有呼叫的選項
rm
都有點危險。我通常只是為我想要執行的整個命令添加前綴,echo
以查看 bash 將給命令提供哪些參數(它如何擴展萬用字元以及它找到哪些文件)。然後,echo
如果一切看起來都很好,請刪除。請注意,這不會列出遞歸找到的文件的內容,-r
但您會看到它要銷毀的目錄。本質上-
echo
如果您想查看它的作用,請使用。用於--
防止失控的旗幟。以防-i
萬一,它會詢問每個文件,您會注意到它是否詢問您不想刪除的內容。只有當你真的想生成一個列表,每行一個文件時,做其他事情才有意義。