在 Bash 中获取文件创建日期/时间
本篇文章将介绍如何在 Bash 中获取文件创建日期/时间。 我们将通过简要介绍旧系统中的文件创建来开始我们的讨论。
稍后我们将学习在 Bash 中创建文件。 最后,我们将讨论在 Bash 中获取文件创建日期/时间的不同方法。
在 Linux 中创建文件
在 Linux 中创建文件有多种方法。 我们可以使用 shell 或桌面文件管理器来创建文件。
本文将重点介绍如何使用 shell 命令在 Bash 上创建文件。
使用 touch 命令
在 Linux 中,touch 命令可用于创建新文件。 touch 命令的语法是 touch 文件名。
要创建一个文件,将其命名为 ABC.XYZ; 我们必须写:
$ touch ABC.XYZ
此命令将创建一个名为 ABC.XYZ 的空文件。 我们可以在当前目录中运行 ls 命令来查看文件(如果已创建)。
使用 cat 命令
我们可以在 cat
命令的帮助下创建一个新文件。 我们可以将重定向操作与将用户的输入合并到一个新文件中。
cat
命令将提示用户输入文本。 用户可以输入返回键移动到下一行。
要完成此命令,请按 Ctrl+D
; 用户输入的整个文本将逐行保存在文件中。 参见示例:
$ cat > my_file.txt
Welcome to Bash shell!
The text entered here will be written into a text file.
Ctrl+D
最后一条语句不是写入的,而是用户按下的用于终止命令的组合键。 作为响应,以下两行将写入名为 my_file.txt 的文本文件中。
使用重定向运算符
我们可以仅使用重定向运算符创建一个空白文件。 输入重定向运算符后跟文件名将创建一个空白文本文件。
例如:
$ > my_file.txt
您可以再次使用 ls 命令来验证文件创建。 也有可能已经存在同名文件,在我们的例子中为 my_file.txt。
在这种情况下,该命令将擦除文件之前的内容,并且会出现一个名为 my_file.txt 的空文件。
我们应该检查并确认以前的内容将在那里或被删除。 使用 cat 命令读取文件的内容。
$ cat my_file.txt
如果没有任何错误,如文件名、目录等的拼写错误,那么该文件将为空。
使用 echo 命令
echo
命令将字符串作为参数并将其显示为输出。 例如:
$ echo "This is the first file"
This is the first file
我们可以在 echo
命令和重定向运算符之后写入一些内容,以使用传递的内容创建一个新文件。 同样,在这种情况下,如果文件已经存在,该命令将删除以前的内容。
参见示例:
$ echo "This is the First file" > firstFile.txt
此 echo 命令的结果将创建一个新文件,其中文件将包含作为参数传递给 echo 的文本。 这些是在 Bash 中创建文件的所有方法。
在 Linux 中获取文件创建日期/时间
成功创建文件后,我们的下一步是查找文件创建的日期和时间。 大多数较旧的系统运行旧的文件系统版本,这些版本需要存储文件创建日期。
由于 POSIX 标准只指定了为每个文件存储的 3 个不同的时间戳值,因此不再需要文件系统支持它们之外的任何内容,即没有可用的创建时间。
这 3 个时间戳存储以下信息:
- 最后访问日期 - atime
- 最后修改日期 - mtime
- 最后更改日期 - ctime
这些值在具有名为 struct stat
的文件特征的结构中返回。 相关细节在网站上有描述。
但是,较新的文件系统(ext4、zfs、btrfs、JFS 和 XFS)将创建时间戳存储在单独的字段中:
- ext4 – crtime
- zfs – crtime
- XFS – crtime
- btrfs – otime
- JFS - di_otime
以上字段将数据存储在文件 inode 中。 在 Bash 中有 3 种不同的方法来获取文件创建日期/时间。
第一个是非常粗糙的(非技术性的)并且可以在旧操作系统上工作,而接下来的两个是技术性的但是在高级操作系统/更新版本中可用。
使用文件名
正如我们已经讨论过的,stat 命令在较旧的操作系统中显示 3 个时间戳,并且没有与文件创建相关的时间戳。 但是,用户(文件创建者)可以将创建时间与文件名连接起来,如果不修改文件名,该方法将有效。
例如:
touch data1_18_oct_2022_10_11_AM
touch data2_18_oct_2022_11_20_AM
...
ls -l
输出:
-rwxrwxrwx 1 root root 0 Oct 18 05:16 data1_18_oct_2022_10_11_AM
-rw-r--r-- 1 14079 14079 0 Oct 18 05:16 data2_18_oct_2022_11_20_AM
...
-rwxrwxrwx 1 root root 69 Oct 18 05:16 main.bash
在输出中,文件创建日期和时间与文件名一起可见(通常,人们有 data1、data2 等文件名)
使用 stat 命令
stat
命令可以直接获取文件创建日期/时间。 旧版本为我们提供了 3 个时间戳值。
这些时间戳值是最近一次访问文件的时间、最后一次修改文件数据的时间以及最后一次更改文件状态的时间。 但在新的操作系统版本中,它还提供了文件的诞生/创建时间。
让我们通过在 Bash 中创建一个新文件并获取日期/时间来检查它。
touch f1
stat f1
touch f2
cat f2>f1
touch f1
stat f1
输出:
Access: 2022-10-17 15:24:16.676971765 +0000
Modify: 2022-10-17 15:24:16.676971765 +0000
Change: 2022-10-17 15:24:16.676971765 +0000
Birth: 2022-10-17 15:24:16.676971765 +0000
Access: 2022-10-17 15:24:16.684972083 +0000
Modify: 2022-10-17 15:24:16.684972083 +0000
Change: 2022-10-17 15:24:16.684972083 +0000
Birth: 2022-10-17 15:24:16.676971765 +0000
在上面的代码中,首先,我们使用 touch 命令创建文件 f1,然后使用 stat 命令检查其创建日期/时间。 然后我们创建另一个名为 f2 的文件。
使用 cat
和 >
,我们将 f2 的内容附加到 f1 的末尾。 然后我们再次制作 f1 并检查其创建日期/时间。
如果我们仔细查看输出,就会知道文件 f1 的访问日期/时间和文件 f1 的出生日期/时间相同,这意味着这两个文件是在相同的日期/时间创建的。
使用 debugfs 命令
debugfs
命令在 ext4 文件系统中也可用; 我们可以使用此命令找到文件创建日期。 请注意,debugfs 命令的主要目的是调试文件系统; 但是,我们也可以使用此命令查找文件创建日期。
首先,我们需要文件的 inode 编号,我们可以使用 ls 命令查看它。 -i 标志使 ls 打印文件的节点号。
$ ls -i ./file
5118705 ./file
df
是我们可以用来打开文件系统的命令。
~ $ df ./file
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 26046564 8380600 16338936 34% /
接下来,我们将这些信息传递给 debugfs 命令,它的语法是 debugfs -R'stat <inode>'/dev/sdX
其中 inode 是我们的文件 inode,/dev/sdX 是文件系统 文件。
$ sudo debugfs -R 'stat <5118705>' /dev/sda2
debugfs 1.46.4 (18-Aug-2021)
Inode: 5118705 Type: regular Mode: 0644 Flags: 0x80000
Generation: 2975709199 Version: 0x00000000:00000001
User: 1000 Group: 1000 Project: 0 Size: 8
File ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x61bc31c8:19fee850 -- Fri Oct 14 06:44:24 2022
atime: 0x61bc3224:7f8fe250 -- Fri Oct 14 06:45:56 2022
mtime: 0x61bc31c8:19fee850 -- Fri Oct 14 06:44:24 2022
crtime: 0x61bc2b65:71f8e150 -- Fri Oct 14 06:17:09 2022
Size of extra inode fields: 32
Inode checksum: 0x5ddd5b4b
EXTENTS:
(0):5279293
上面可见的 crtime
字段具有文件创建时间。 文件创建时间 Fri Oct 14 06:17:09 2022 是创建文件的确切日期。
但是,请注意字段
ctime
看起来相似但不同。crtime
字段包含的时间是文件的最后一次状态更改,如文件权限的更改。
在本文中,我们描述了 3 种获取文件创建日期和时间的方法。 这取决于用户使用的是旧操作系统还是新操作系统。
在老版本的情况下,我们可以采用第一种,非技术性的方式。 否则,第二种和第三种方法可用,其中管理在操作系统内部。
用户可以通过运行相关命令获取创建日期和时间。
相关文章
在 Bash 脚本中执行变量中的命令
发布时间:2023/05/18 浏览次数:106 分类:操作系统
-
本篇文章是关于将 Bash 命令存储在一个变量中,然后直接从这个变量中执行它。 首先,我们将讨论执行变量中包含的命令的多种方法,然后是几个脚本示例。
Bash md5sum 命令
发布时间:2023/05/18 浏览次数:197 分类:操作系统
-
本篇文章介绍如何在 Bash 中使用 md5sum 命令。Bash md5sum 命令。md5sum 命令打印给定文件的 32 字符和 128 位校验和。
在 Bash 中排序数组
发布时间:2023/05/18 浏览次数:150 分类:操作系统
-
对数组进行排序对于任何编程语言来说都是一项非常常见的任务。 在 Bash 脚本中,我们还可以通过两种不同的方式完成此任务。
Bash 中的多维数组
发布时间:2023/05/18 浏览次数:70 分类:操作系统
-
多维数组对于任何程序都是非常重要的元素。 它主要用于创建数据的表视图和许多其他用途。本文演示如何创建二维数组。 此外,我们将通过必要的示例和解释来讨论该主题。
在不指定 Bash 中的索引的情况下将新数据附加到数组
发布时间:2023/05/18 浏览次数:58 分类:操作系统
-
在 Bash 脚本中,您还可以使用数组; 您可以对数组进行声明、修改和操作。但在本文中,我们将逐步了解如何声明一个数组并将新数据添加到其中。 我们将看到在数组中添加新数据的两种不同
在 Bash 中打印数组元素
发布时间:2023/05/18 浏览次数:192 分类:操作系统
-
本文将展示我们如何在 Bash 脚本中打印数组元素。 为此,我们将讨论 5 种不同的方法。在 Bash 中使用 echo 语句打印数组元素
将数组传递给 Bash 中的函数
发布时间:2023/05/18 浏览次数:118 分类:操作系统
-
这篇文章是关于在 Bash 脚本中使用函数并将数组传递给它们的。 在进入实际主题之前,我们将简要介绍 Bash 脚本。