
我正在嘗試編寫一個腳本,確保所有文字檔案都以換行符結尾。
當我在特定資料夾中運行此命令時:
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
,並在檔案實際修改時輸出自訂訊息。
也可以看看: