我想在所有 .sh 檔案中附加一條包含檔案修改日期的行。
要將變數文本附加到所有 .sh 檔案:
find -name "*.sh" -exec sed -i '$a \\n# '"$date"'' {} \;
獲取檔案修改年份:
find -name "*.sh" -exec stat -c %y {} \; | awk '{print $1}' | awk -F- '{print $1}'
如何結合這些來獲取每個檔案的年份并將其插入檔案內容中?
uj5u.com熱心網友回復:
這個find單線可能是您想要的:
find -name '*.sh' -exec bash -c 'printf "# %(%Y)T\n" $(stat -c %Y "$1") >> "$1"' _ {} \;
假設你有stat來自 GNU coreutils。
一些注意事項:bash執行命令字串
的語法是bash -c command_string arg_0 arg_1 ... arg_n(args 是可選的)。arg_0對應于 bash 特殊引數$0,arg_1對應于 bash 特殊引數$1,等等,在命令字串中。對于find找到的每個檔案,將{}替換為路徑名并執行 bash 命令。字串_被分配給$0(它通常代表 shell 或 shell 腳本的名稱,我們在這里不感興趣,因為我們運行的是命令字串,而不是檔案),路徑名被分配給$1,然后命令printf "# %(%Y)T\n" $(stat -c %Y "$1") >> "$1"被執行。stat -c %Y將上次資料修改的時間列印為自 Epoch 以來的秒數和格式%(%Y)T規范printf內置的bash將此值解釋為一年。
uj5u.com熱心網友回復:
使用 GNU find 和 GNU awk 并假設您的檔案名中沒有換行符或前導/尾隨空格
while read -r year file; do
awk -i inplace -v year="$year" '{print} ENDFILE{print "#", year}' "$file"
done < <(find . -type f -name '*.sh' -printf '%TY %p\n')
您可以使用從 find 到 awk 的管道更有效地完成此操作,然后修改 ARGV[] 以創建檔案串列,您可以使其能夠處理名稱中的換行符,但它的代碼更多,我太懶了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410609.html
標籤:
