如何从特定目录中的文件列表中获取最新文件?

如何从特定目录中的文件列表中获取最新文件?

我需要从特定目录中的文件列表中获取最新文件。

当我第一次运行脚本时,我已将特定目录中的文件列表复制到另一个目录。

从第二次运行开始,我需要从同一目录中的文件列表中获取最新文件,以将这些文件复制到另一个目录中。

在第一次运行中,我将最后一个文件的创建日期捕获到一个变量中,当脚本第二次运行时,文件大于第一次运行中的最后一个文件创建日期;这些文件需要复制到其他目录。

请问有人可以帮我获取最新的文件吗?

答案1

ls -t1 |  head -n 1

第一个将列出按访问时间排序的所有文件,后者选择第一行。

答案2

在zsh中,当前目录下的最新文件是

a=(*(om[1]))
latest_file=$a[1]
cp -p $latest_file /other/directory

全局限定符摇滚,但不幸的是,即使您只请求一个元素,结果仍然是一个列表,因此是临时数组a。)

在其他 shell 中,如果您知道文件名不能包含换行符或不可打印的字符,则可以使用ls

latest_file=$(ls -t | head -n 1)
cp -p "$latest_file" /other/directory

然而,似乎您真正要求的是比特定文件更新的文件列表。为此,您可以使用-cnewer内置的find来检测其内容或元数据比某些其他文件最近更改的文件。请注意,我在这里调用它的方式find也会收集子目录中的文件。

find . -cnewer "$previous_latest_files" -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +

问题仍然是检测以前的最新文件……事实上,重要的是副本的日期。因此,在进行复制时创建一个标记文件。

find . -cnewer marker_file -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
touch marker_file

如果文件保留在目标目录中,那么您可以简单地同步这两个目录。请注意,如果您从目标目录中删除了一些旧文件,但它们仍保留在源目录中,则将使用此方法再次复制它们。

rsync -a . /other/directory/

答案3

如果您只是根据文件的修改时间将文件从一个目录复制到另一个目录,您可能会考虑rsync.执行相同操作的一个非常简单的方法可能是:

rsync -t ./dir1/ ./dir2/

或者只是看看它会做什么添加:

rsync -t --list-only ./dir1/ ./dir2/

-t正如 Gilles 在下面的评论中指出的那样,可能会出现一些情有可原的情况,导致您无法使用该选项。但如果你从中拿走任何东西,那就是你应该测试为了获得您想要的结果,该rsync选项 --list-only是一种非常简单的方法。

另外,也许...

man rsync

答案4

如果您的实际目标是根据修改时间移动一堆文件并且您的系统版本find支持-newerXY测试类型,您可以执行类似的操作

find -type f -newermt "@$lasttime" -exec mv -t path/to/destination/ {} +

其中$lasttime是您之前保存的文件修改时间,自纪元以来以秒为单位(例如从 获得stat -c %Y yourfile)。

您还可以直接使用find -newer somefilefind -newermm somefile来将修改时间与参考文件的修改时间进行比较,而不是将参考文件的时间戳保存在变量中。

要将选择限制为当前目录(不包括子目录),您可以添加-maxdepth 1到命令中find

相关内容