Rm

有沒有一種簡單的方法來預覽 rm 將刪除的文件?

  • September 23, 2015

有沒有一種簡單的方法來評估給定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源文件的情況下做到這一點:

  1. 查找系統版本的原始碼rm。您可能需要下載源包或其他任何東西。GNUrm是“核心實用程序”的一部分,由兩個 C 文件、rm.cremove.c、以及幾個標頭檔組成。一旦設置好編譯系統實用程序,剩下的就很簡單了。
  2. 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;
}
  1. 最後,像這樣編譯你的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萬一,它會詢問每個文件,您會注意到它是否詢問您不想刪除的內容。只有當你真的想生成一個列表,每行一個文件時,做其他事情才有意義。

引用自:https://unix.stackexchange.com/questions/120284