Find

如何查看“ed”命令更改了哪些文件?

  • December 16, 2020

我正在嘗試編寫一個腳本,以確保所有文本文件都以換行符結尾。

當我在特定文件夾中執行此命令時:

find . -exec ed -s {} <<< w \;

我得到以下輸出:

Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended

好的,但是換行符附加到哪些文件?我在 Git 歷史記錄中看不到任何更改,那麼這些未跟踪的文件呢?

我還故意從我的一個文本文件的末尾刪除了換行符,並且ed沒有將其添加回來……

您的命令略有錯誤,因為<<<輸入重定向(此處為字元串)附加到find,而不是ed

要稍微擴展您的命令:

find . -type f -exec sh -c '
   for pathname do
       echo w | ed -s "$pathname"
   done' sh {} +

這只會影響目前目錄或其下方任何位置中的正常文件,並且不會嘗試使用ed. 請注意,二進製文件也是正常文件,因此我們必須假設您僅在包含文本文件的目錄中執行它(以免損壞已編譯的執行檔、圖像文件等)

對於成批的正常文件,這將呼叫一個簡短的內嵌 shell 腳本。該腳本將遍歷 給它的路徑名find並打開每個 in ed,只是為了立即保存文件。這會將換行符添加到尚未以換行符結尾的文件中。

要獲得有關由此實際修改的文件的提示,請在呼叫之前列印出路徑名ed。這將輸出所有找到的路徑名,但列表中會穿插其中一些之後的“添加新行”消息。

find . -type f -exec sh -c '
   for pathname do
       printf "%s\n" "$pathname"
       echo w | ed -s "$pathname"
   done' sh {} +

要檢測哪些文件實際上被此修改,您可以寫入臨時文件,將其與原始文件進行比較,如果有差異,則將原始文件替換為臨時文件。

find . -type f -exec sh -c '
   tmpfile=$(mktemp); trap "rm -f \"$tmpfile\"" EXIT
   for pathname do
       printf "w %s\n" "$tmpfile" | ed -s "$pathname" 2>/dev/null
       if ! cmp -s "$tmpfile" "$pathname"; then
           printf "Fixed %s\n" "$pathname"
           mv "$tmpfile" "$pathname"
       fi
   done' sh {} +

這有一個額外的好處,即您不會更新您實際修改的文件以外的文件的時間戳。

這也抑制了“添加新行”消息ed,而是在文件實際被修改時輸出自定義消息。

也可以看看:

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