Bash

無法指定文件創建日期

  • May 17, 2021

我想自動創建一些文件,所以我創建了一個腳本。我還想指定這些文件的創建日期。

例如,在終端中,要創建一個創建日期為2012 年 5 月 12 日file.txt ,如下所示,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"

腳本的最後一部分,寫入每個文件,將導致文件的最後修改時間全部更新為目前時間。更改使用時間touch應該是您對文件做的最後一件事。

請注意,touch不能更改創建時間(在跟踪它的文件系統上);請參閱如何更改文件創建時間?(觸摸更改僅修改時間)了解詳情。

我還想指定這些文件的創建日期”你不能這樣做,因為它是創建時間(“出生時間”,或btime)。它也很難訪問 - 特別是不是 for lsor touch- 但看看stat你是否確實想訪問它。相反,您看到的是最後修改的日期時間。

我要問的第一個問題是在您使用它們時是否$database_dir並且$dat_file具有預期值。如果其中任何一個名稱中可能包含空格,則必須將它們放在雙引號中(無論如何,這是一種很好的做法)。例如,

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

現在已經看到了完整的腳本,所有文件都包含目前日期/時間的原因是因為您看到的值是最後修改日期,而不是創建日期。echo您最後使用腳本末尾的五個語句集修改文件,因此它們都將具有目前日期/時間。

引用自:https://unix.stackexchange.com/questions/650076