如何根据时间过滤一部分文件?
How do I filter down a subset of files based upon time?
假设我做了很多工作,将目录中的文件列表缩减为我感兴趣的 10 个文件。有数百个文件,我终于找到了我需要的文件。
我可以输出结果(从 ls
输出),或者我可以说我有一个包含这些值的数组(在脚本中执行此操作)。没关系。
现在,在该列表中,我只想查找昨天创建的文件。
我们可以使用 find -mtime 1
这样的工具,这很好。但是我们如何处理目录中的文件子集呢?我们可以通过 xargs
将子集传递给 find
吗?
我可以用 for
循环很容易地做到这一点。但是我很好奇你们这些聪明人是否知道单线。
如果它们在数组中:
files=(...)
find "${files[@]}" -mtime 1
如果通过管道输入:
... | xargs -d'\n' -I{} find {} -mtime 1
请注意,第二个将为每个文件 运行 一个单独的 find
命令,这有点低效。
如果任何项目是目录并且您不想在其中搜索,请添加 -maxdepth 0
以禁用 find
的递归。
另一个不会递归的选项,不过如果我是你的话我会使用 John 的 find
解决方案。
$: stat -c "%n %w" "${files[@]}" | sed -n "
/ $(date +'%Y-%m-%d' --date=yesterday) /{ s/ .*//; p; }"
stat
将打印数组中文件的名称和创建日期。
sed
"greps" 您想要的日期并在打印文件名之前去除日期信息。
假设我做了很多工作,将目录中的文件列表缩减为我感兴趣的 10 个文件。有数百个文件,我终于找到了我需要的文件。
我可以输出结果(从 ls
输出),或者我可以说我有一个包含这些值的数组(在脚本中执行此操作)。没关系。
现在,在该列表中,我只想查找昨天创建的文件。
我们可以使用 find -mtime 1
这样的工具,这很好。但是我们如何处理目录中的文件子集呢?我们可以通过 xargs
将子集传递给 find
吗?
我可以用 for
循环很容易地做到这一点。但是我很好奇你们这些聪明人是否知道单线。
如果它们在数组中:
files=(...)
find "${files[@]}" -mtime 1
如果通过管道输入:
... | xargs -d'\n' -I{} find {} -mtime 1
请注意,第二个将为每个文件 运行 一个单独的 find
命令,这有点低效。
如果任何项目是目录并且您不想在其中搜索,请添加 -maxdepth 0
以禁用 find
的递归。
另一个不会递归的选项,不过如果我是你的话我会使用 John 的 find
解决方案。
$: stat -c "%n %w" "${files[@]}" | sed -n "
/ $(date +'%Y-%m-%d' --date=yesterday) /{ s/ .*//; p; }"
stat
将打印数组中文件的名称和创建日期。
sed
"greps" 您想要的日期并在打印文件名之前去除日期信息。