查找文件并插入文件修改日期

Find files and insert file modification date

我想在所有 .m 文件中附加一行包括文件修改日期(最好只是年份)。

要将可变文本附加到所有 .sh 文件: find . -name "*.m" -exec sed -i '$a \n# File last modified in '"$date"'' {} \;

我可以获取每个文件的年份并将其插入同一行的文件内容中吗?

使用 GNU find 和 GNU awk 并假设您的文件名中没有换行符或 leading/trailing 白色 space

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[] 来创建文件列表,你可以更有效地做到这一点,你可以让它能够处理名称中的换行符,但它有更多的代码,我'我太懒了

这个 find 单行线可能就是您想要的:

find -name '*.sh' -exec bash -c 'printf "# %(%Y)T\n" $(stat -c %Y "") >> ""' _ {} \;

假设您有 stat 来自 GNU coreutils。

一些注意事项: 执行命令字符串的 bash 语法是 bash -c command_string arg_0 arg_1 ... arg_n (args 是可选的)。 arg_0对应bash特殊参数[=16=]arg_1对应bash特殊参数</code>,以此类推,在命令字符串中。对于 <code>find 找到的每个文件,{} 替换为路径名并执行 bash 命令。字符串 _ 被分配给 [=16=](它通常代表 shell 或 shell 脚本的名称,我们在这里不感兴趣,因为我们是 运行一个命令字符串,不是一个文件),路径名被分配给</code>,然后执行命令<code>printf "# %(%Y)T\n" $(stat -c %Y "") >> ""stat -c %Y 打印出自 Epoch 以来的秒数的最后一次数据修改时间,bashprintf 内置格式规范 %(%Y)T 将此值解释为一年。