使用FIND命令时显示修改日期
1. 概述
在 Linux 中,我们通常可以通过列出文件的父目录来显示文件的修改日期或时间戳。获取此信息的另一种常用方法是使用stat 命令。有时,在搜索文件时显示此信息可能更方便或更有效。
在本教程中,我们将了解如何在*find *命令的输出中显示文件的修改日期。
2.使用find命令的printf选项
首先,让我们看一下find命令的默认输出,它只显示找到的文件的名称:
$ find . -name '*json*'
./json-folder
./.eslintrc.json
./file with-space.json
./package.json
./tsconfig.json
我们可以使用printf选项轻松地使输出更有用。find命令的 GNU 版本包括一个名为printf的选项或标志。它接受一个参数,这是将被解释并输出到stdout的格式。解释的输出替换命令的默认输出,并且对找到的每个文件进行解释。
该格式由以反斜杠 () 开头的转义和以百分号 (%) 开头的指令组成。我们使用*%t和%Tk指令来显示文件的最后修改时间。让我们看一下printf*选项的示例用法,其中我们打印找到的文件的名称及其最后修改时间:
$ find . -name '*json*' -printf "%-25p %t\n"
./json-folder Mon Aug 23 03:37:42.1869447530 2021
./.eslintrc.json Mon Aug 9 00:09:14.6669121720 2021
./file with-space.json Mon Aug 23 02:39:25.1991621890 2021
./package.json Mon Aug 9 00:08:08.5493444190 2021
./tsconfig.json Mon Aug 9 00:08:58.9590148590 2021
在上面的例子中,我们在文件名printf指令中指定了一个叫做字段宽度的东西。指令宽度的单位是字符数。如果该指令的解释值的宽度小于指定的宽度,则用空格填充。指令的字段宽度在指令的 % 符号之后指定。% 符号和宽度之间的连字符 (-) 指定解释的值应该是左填充的。
可以在手册页中找到转义和指令的完整列表 ,但让我们看一下其中的一些:
- \n – 换行符
- \t – 水平制表符
- %p – 文件名
- %M – 文件的权限
- %Tk – 文件的最后修改时间,格式由k指定。find命令的手册页包含k可能值的完整列表。
2.1. 自定义辅助函数
*我们可以在~/.bashrc文件中添加一个辅助 bash 函数,以提高使用printf*选项的效率。**该函数搜索名称中包含特定单词的文件,并显示文件的修改时间以及其他信息。我们来看看函数:
function findnamed {
find ${2:-.} -name "*$1*" -printf "%M %-6u %-6g %-${3:-40}p %TY-%Tm-%Td %TH:%TM\n"
}
上面的函数需要三个参数。第一个参数是按名称搜索文件时使用的关键字。第二个是要搜索的目录,默认值为当前目录。第三个是printf选项里面filename指令的字段宽度,默认值为40。
现在,让我们看看如何通过仅提供搜索关键字来使用该功能:
$ findnamed '*json'
drwxrwxr-x haben haben ./json-folder 2021-08-23 03:37
-rw-rw-r-- haben haben ./.eslintrc.json 2021-08-09 00:09
-rw-rw-r-- haben haben ./file with-space.json 2021-08-23 02:39
-rw-rw-r-- haben haben ./package.json 2021-08-09 00:08
-rw-rw-r-- haben haben ./tsconfig.json 2021-08-09 00:08
我们还可以通过提供要搜索的目录和文件名指令的字段宽度来调用该函数:
$ findnamed '*json' project-root/ 35
drwxrwxr-x haben haben project-root/json-folder 2021-08-23 03:37
-rw-rw-r-- haben haben project-root/.eslintrc.json 2021-08-09 00:09
-rw-rw-r-- haben haben project-root/file with-space.json 2021-08-23 02:39
-rw-rw-r-- haben haben project-root/package.json 2021-08-09 00:08
-rw-rw-r-- haben haben project-root/tsconfig.json 2021-08-09 00:08
3. 使用xargs命令和find命令
xargs命令用于从标准输入执行命令。在我们的例子中,我们可以使用它在find命令结果上执行ls 和stat之类的命令,以显示文件的修改时间。 通过将命令的结果通过管道传输到*xargs中,可以为find*命令找到的每个文件执行命令。**
如果存在包含空格的文件名,则xargs的默认行为将不适用于find命令的输出。我们需要告诉xargs只使用*\n作为分隔符来解决这个问题。这可以通过使用GNU 版本的xargs上的**-d*选项来完成。
同样,我们也可以通过使用tr 命令和使用xargs命令的*-0* 选项将换行符 (\n) 转换为空字符 (\0) 来做到这一点。
让我们看看如何使用xargs为find 找到的每个文件调用stat命令:
$ find . -name "*json*" | xargs -d '\n' stat -c "%-25n %y"
./json-folder 2021-08-23 03:37:42.186944753 +0300
./.eslintrc.json 2021-08-09 00:09:14.666912172 +0300
./file with-space.json 2021-08-23 02:39:25.199162189 +0300
./package.json 2021-08-09 00:08:08.549344419 +0300
./tsconfig.json 2021-08-09 00:08:58.959014859 +0300
我们还可以使用xargs为find 找到的每个文件调用ls命令:
$ find . -name "*json*" | xargs -d '\n' ls -ld
-rw-rw-r--. 1 haben haben 2259 Aug 9 00:09 ./.eslintrc.json
-rw-rw-r--. 1 haben haben 2259 Aug 23 02:39 './file with-space.json'
drwxrwxr-x. 2 haben haben 4096 Aug 23 03:37 ./json-folder
-rw-rw-r--. 1 haben haben 2259 Aug 9 00:08 ./package.json
-rw-rw-r--. 1 haben haben 2259 Aug 9 00:08 ./tsconfig.json
4. 使用find命令的exec选项
find命令的exec 选项可以与上面使用的xargs命令类似地使用。但是,使用exec选项可能比xargs慢,而且更难阅读。让我们看看如何使用exec选项为 find命令找到的每个文件执行stat命令:
$ find . -name "*json*" -exec stat -c "%-25n %y" {} \;
./json-folder 2021-08-23 03:37:42.186944753 +0300
./.eslintrc.json 2021-08-09 00:09:14.666912172 +0300
./file with-space.json 2021-08-23 02:39:25.199162189 +0300
./package.json 2021-08-09 00:08:08.549344419 +0300
./tsconfig.json 2021-08-09 00:08:58.959014859 +0300
我们还可以使用exec选项为find找到的每个文件调用ls命令:
$ find . -name "*json*" -exec ls -ld {} \;
drwxrwxr-x. 2 haben haben 4096 Aug 23 03:37 ./json-folder
-rw-rw-r--. 1 haben haben 2259 Aug 9 00:09 ./.eslintrc.json
-rw-rw-r--. 1 haben haben 2259 Aug 23 02:39 './file with-space.json'
-rw-rw-r--. 1 haben haben 2259 Aug 9 00:08 ./package.json
-rw-rw-r--. 1 haben haben 2259 Aug 9 00:08 ./tsconfig.json