如何查看“ed”命令更改了哪些檔案?

如何查看“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沒有將其添加回來...

答案1

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

稍微擴充一下你的命令:

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

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

對於批次的常規文件,這將呼叫一個簡短的內聯 shell 腳本。該腳本將循環遍歷 給定的路徑名find,並在 中開啟每個路徑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,並在檔案實際修改時輸出自訂訊息。

也可以看看:

相關內容