Find
如何查看“ed”命令更改了哪些文件?
我正在嘗試編寫一個腳本,以確保所有文本文件都以換行符結尾。
當我在特定文件夾中執行此命令時:
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
並打開每個 ined
,只是為了立即保存文件。這會將換行符添加到尚未以換行符結尾的文件中。要獲得有關由此實際修改的文件的提示,請在呼叫之前列印出路徑名
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
,而是在文件實際被修改時輸出自定義消息。也可以看看: