编辑文件时保留时间戳
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
另一个可以直接从终端运行的尝试。
首先执行第一步,然后开始处理您的文件。
保留旧时间戳。
它从当前目录开始操作,排除所有隐藏文件,保存到/tmp/files
中的临时文件中。您可以随时更改参数,但最好还是使用 -printf '"%t" "%p"\n'
,因为后面的 touch
命令会利用它。
find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
随意修改文件
现在创建一个文件来帮助您恢复时间戳:
while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times
最后将旧日期应用于修改后的文件
sh job.sh
警告:适用于具有名称间距、特殊字符的文件,但例如没有带有 $
符号的文件和带有双 space 的文件。
我想在 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
另一个可以直接从终端运行的尝试。
首先执行第一步,然后开始处理您的文件。
保留旧时间戳。 它从当前目录开始操作,排除所有隐藏文件,保存到
/tmp/files
中的临时文件中。您可以随时更改参数,但最好还是使用-printf '"%t" "%p"\n'
,因为后面的touch
命令会利用它。find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
随意修改文件
现在创建一个文件来帮助您恢复时间戳:
while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times
最后将旧日期应用于修改后的文件
sh job.sh
警告:适用于具有名称间距、特殊字符的文件,但例如没有带有 $
符号的文件和带有双 space 的文件。