用一组文件中的当前时间戳替换旧时间戳

Replace old timestamp with current timestamp in set of files

我有一些文件驻留在目录中:

TESTRP_20201126220042.TAB
TESTRP_20201214145845.TAB
TESTRP_20210201145846.TAB
TESTRP_20210304134849.TAB

这里我需要用当前时间戳日期替换旧时间戳+%Y%m%d%H%M%S

我试过运行下面的代码:

find . -type f -name '*TESTRP_*' -exec sh -c '
    now=$(date '+%Y%m%d%H%M%S')
    for pathname do
        mv "$pathname" "${TESTRP}_$now.TAB"
    done' sh {} +

但它给了我一个输出文件 _20210630083729.TAB 而不是三个具有更新时间戳的文件。

也许像

shopt -s extglob # Turn on bash extended globbing if not already enabled
for file in TESTRP_+([0-9]).TAB; do
    mv "$file" "${file/+([0-9])/$(date '+%Y%m%d%H%M%S')}"
    sleep 1
done

应该每秒重命名一个文件。或者,在时间戳后添加一个计数器并在每个文件上递增它:

shopt -s extglob
now=$(date '+%Y%m%d%H%M%S')
declare -i fileno=0
for file in TESTRP_+([0-9]).TAB; do
    newts=$(printf "%s%04d" "$now" "$fileno")
    mv "$file" "${file/+([0-9])/$newts}"
    ((fileno++))
done

或者看起来 date 的某些版本具有纳秒的 %N 格式,这在 date '+%Y%m%d%H%M%S%N'[=15= 的任何两次调用中不应导致相同的时间戳]