编辑文件时保留时间戳

Preserve timestamp when editing file

我想在 for 循环中保留我正在编辑的文件的时间戳

for files in $DIR/MDC*/$FILE
do
    # Need to get date here!
    dos2unix $files
    if grep -q $TYPE $files; then
        echo 'done'
    else
        sed -i "1s/^/$TYPE\n/" $files
    fi
    $DIR/crccalc/LDDR16.py $files
    # Use Date variable here to change it back

done

问题是我需要从文件中获取格式化的日期字符串,这样我就可以touch -r在循环完成后恢复文件日期。

stat 没有提供我需要的格式。

要求的格式:

YYMMDDhhmm

有一个很好的技巧:使用 touch -r reference_file。也就是touch这个文件使用另一个文件的时间戳作为参考。

来自 man touch:

   -r, --reference=FILE
          use this file's times instead of current time

您可能会问:这对您有何帮助?好吧,因为您可以创建一个虚拟文件 dummy 来处理:

  • 在修改文件之前,请触摸 dummy 和要修改的文件 original_file 的时间戳。
  • 你修改original_file.
  • 然后使用 dummy 的时间戳触摸 original_file

总计:

for files in $DIR/MDC*/$FILE
do
    # copy its timestamp to `dummy_file`
    touch -r "$files" "dummy_file"

    # ...things...

    # Use Date variable here to change it back
    touch -r "dummy_file" "$files"
done

另一个可以直接从终端运行的尝试。

首先执行第一步,然后开始处理您的文件。

  1. 保留旧时间戳。 它从当前目录开始操作,排除所有隐藏文件,保存到/tmp/files中的临时文件中。您可以随时更改参数,但最好还是使用 -printf '"%t" "%p"\n',因为后面的 touch 命令会利用它。

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. 随意修改文件

  3. 现在创建一个文件来帮助您恢复时间戳:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. 最后将旧日期应用于修改后的文件

    sh job.sh

警告:适用于具有名称间距、特殊字符的文件,但例如没有带有 $ 符号的文件和带有双 space 的文件。