无法指定文件创建日期

无法指定文件创建日期

我想自动创建一些文件,所以我创建了一个脚本。我还想指定这些文件的创建日期。

例如,在终端中创建一个文件.txt创建日期为2012 年 5 月 12 日我可以touch如下所示,

touch -d 20120512 file.txt

列出该文件确认日期,

-rw-rw-r-- 1 lenovo lenovo 0 May  12  2012 file.txt

如果我在脚本中应用上述内容,我正在创建的文件都将当前时间作为创建时间,而不是我指定的时间。我在这里做错了什么?

脚本

#!/bin/bash

##################################
#Generate dat and snapshot files.#
##################################
srv_dir="/home/lenovo/Source/bash/srv"
main_dir="${srv_dir}/main"
database_dir="${main_dir}/Database"
dat_file="${main_dir}/remote.dat"

if [[ -e ${main_dir} ]]; then
    echo "${main_dir} allready exists."
    echo "Aborting..."
    exit 0
fi

# Create directories.
mkdir -p ${database_dir}

# Create files.
if [[ $1 == "--dat-newer" ]]; then
    # User wants dat file to be the latest modified file.
    
    # Create dat file with date as 'now'.
    touch ${dat_file}

    # Create snapshots with older dates.
    touch -d 20210511 "${database_dir}/snapshot001"
    touch -d 20210510 "${database_dir}/snapshot002"
    touch -d 20210512 "${database_dir}/snapshot004"
    touch -d 20210514 "${database_dir}/snapshot003"
else
    # Create an old dat file.
    touch -d 20210512 "${dat_file}"

    # Create snapshots with older dates.
    touch -d 20210511 "${database_dir}/snapshot001"
    touch -d 20210510 "${database_dir}/snapshot002"
    touch -d 20210512 "${database_dir}/snapshot004"

    # Create snapshot003 with date as 'now'.
    touch "${database_dir}/snapshot003"
fi

# populate dat and snapshot files with data.
echo "Data of ${dat_file}" > "${database_dir}/snapshot001"
echo "Data of snapshot001" > "${database_dir}/snapshot001"
echo "Data of snapshot002" > "${database_dir}/snapshot002"
echo "Data of snapshot003" > "${database_dir}/snapshot003"
echo "Data of snapshot004" > "${database_dir}/snapshot004"

答案1

脚本的最后一部分写入每个文件,将导致文件的上次修改时间全部更新为当前时间。改变时间使用touch应该是最后的您对文件所做的事情。

请注意,touch无法更改创建时间(在跟踪它的文件系统上);看如何更改文件创建时间? (触摸仅改变修改时间)了解详情。

答案2

我还想指定这些文件的创建日期“你不能这样做,因为它是创建时间(“出生时间”,或btime)。它也很难访问 - 特别是不是lstouch- 但看看stat你是否确实想要访问它。相反,你所看到的是最后修改的日期时间。

我要问的第一个问题是,在使用它们时$database_dir是否具有预期值。$dat_file如果它们的名称中可能包含空格,则必须将它们放在双引号中(无论如何,这都是一个很好的做法)。例如,

touch -d 20210511 "${database_dir}/snapshot001"

现在已经看到完整的脚本,文件全部包含当前日期/时间的原因是因为您看到的值是上次修改日期,而不是创建日期。您最后使用echo脚本末尾的五个语句集修改了文件,因此它们都将具有当前日期/时间。

相关内容