Contents

获取目录中的最新文件

1. 概述

我们可以使用几个命令来获取有关目录中文件和文件夹的不同类型的信息。在本教程中,我们将重点介绍用于获取有关目录中最近更新或修改的文件的信息的命令。

2. 设置

让我们创建一个示例目录:

$ mkdir sample_directory

然后,我们导航到它并添加随机文件。我们将按时间顺序创建和命名文件以跟踪它们:

$ cd sample_directory
$ touch file_1.txt
$ touch file_2.txt
$ touch file_3.txt

我们总体上应该有这个目录结构:

$ ls
file_1.txt  file_2.txt  file_3.txt

3. 使用find

**find 是一个 Linux 命令,用于搜索文件和目录并对其执行操作。**它支持按文件类型、文件夹、名称、创建日期、修改日期、所有者和权限进行搜索。

让我们使用此命令显示示例目录中的最新文件:

$ find /sample_directory -type f -printf "%t - %p\n" | sort -n | tail -1
Fri Feb 11 05:11:07.8808152360 2022 - sample_directory/file_3.txt

以下是此命令的细分:

  • -type f:定位目录中的所有文件
  • “%t %p\n”:为每个文件打印一个新行,其中*%t是文件的最后修改时间,%p是文件名路径。\n*创建新行。
  • sort -n:根据数值排序
  • tail -1:打印最后一行

file_3.txt是我们在设置过程中创建的最后一个文件,这证明find命令有效。

此外,我们可以使用find显示几个按降序排列的最近文件:

$ find sample_directory/ -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'
./file_3.txt
./file_2.txt
./file_1.txt

以下是命令的细分:

  • -exec stat -c ’%X %n’:打印最后访问时间,后跟工作目录中每个文件的文件路径
  • sort -nr:按逆序排序
  • awk ‘NR==1,NR==3 {print $2) ‘:打印第一行、第二行和第三行的第二个字段,在我们的例子中代表文件名。*‘NR’*是 awk 中的一个特殊内置变量,用于处理我们指定的文件中存在的记录数。

我们可以通过增加或减少awk命令中的值3来更改显示的最近文件的数量。

4. 使用ls

**ls 命令列出Linux 和其他基于 Unix 的操作系统中的文件或目录。**它接受几个标志,允许我们修改文件和文件夹在终端上的列出方式。

我们可以使用ls通过这个命令查看最近的文件:

$ ls sample_directory/ -Artls | tail -1
0 -rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_3.txt

以下是命令的细分:

  • -A:列出除以 . 开头的所有文件之外的所有文件。和 ..
  • -r : 排序时倒序
  • -t:按时间排序,最新的在前
  • -l:使用长列表格式
  • -s:打印每个文件的分配大小
  • tail -1:打印最后一行

当文件名包含空格或换行符等特殊字符时,使用ls解析数据很容易出错,因为ls命令默认使用换行符分隔文件名。

在上面的输出中,file_3.txt的大小为 0 字节,因为它是一个空文本文件。

或者,我们也可以使用这个ls命令来获取最新的文件:

$ ls -tp | grep -v /$ | head -1
file_3.txt

以下是此命令的细分:

  • -t:按时间排序
  • -p:在目录后面附加一个斜杠
  • grep -v /$:删除所有以正斜杠结尾的行
  • head -1:将输出限制为单个文件。排除*-1*后缀将显示按降序排列的所有文件。

此外,我们还可以按降序显示最近创建或修改的文件:

$ ls -tl
total 0
-rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_3.txt
-rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_2.txt
-rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_1.txt

5. 使用 Bash 脚本

Bash 脚本是一个纯文本文件,其中包含我们通常必须在终端上手动键入的一系列命令。这在保存经常使用的命令或运行命令链时很有用。

在大型目录树中执行搜索时,此方法比find相对快

让我们创建一个将检索最新文件的递归 Bash 脚本文件。

首先,让我们在工作目录中创建一个可执行文本文件:

$ touch bash_script.sh

接下来,让我们添加/shebang 标头 。这确保了 Bash 将用于解释脚本:

$ echo "#!/bin/bash" >> bash_script.sh

接下来,让我们用*nano *编辑器打开文件,然后将这段代码粘贴到 shebang 标题下:

CURRENT_DIR='.'
get_recent_file () {
    FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
    if [ ! -f ${FILE} ]; then
        CURRENT_DIR="${CURRENT_DIR}/${FILE}"
        get_recent_file
    fi
    echo $FILE
    exit
}
get_recent_file

此函数检索目录中的最新项目。如果该项目是一个目录,它将导航到该目录并递归查找最近的项目。 最后,我们需要将bash_script.sh 文件设置为可执行文件:

$ chmod +x bash_script.sh

我们现在可以使用以下命令从终端执行我们的脚本文件:

$ ./bash_script.sh
bash_script.sh

输出将bash_script.sh显示 为最新文件,因为它是我们在工作目录中更新的最后一个文件。

6. 使用perl

perl是一种通用、高级、解释型和动态编程语言。它最初是为文本处理和将文本文件转换为不同格式而开发的。 要获取目录中最新的文件,我们将通过管道将perlfind命令结合起来:

$ find sample_directory/ -type f -printf '%itcodingman@blogdemo\t%p\n' | perl -ane '@itcodingman@blogdemo if ($F[0]>$m[0]); END{print $m[1];}' 
./file_3.txt

以下是此命令的细分:

  • -type f:定位目录中的所有文件
  • ’% itcodingman@blogdemo \t%p\n’ : 为每个文件打印一个新行,其中*%T是特定格式的文件的最后修改时间,%p*是文件路径
  • -ane ‘@ itcodingman@blogdemo if ($F[0]>$m[0]); END :每个输入记录都被拆分并存储在一个名为@F的数组中。然后它检查*@F数组中第一个元素的值是否大于@m*数组中的值。
  • {print $m[1];} :打印*@m*数组的第二个值,代表文件名