从目录中获取最新文件

从目录中获取最新文件

在 bash 脚本中,我使用以下命令从特定目录获取最新的备份文件:

find /mnt/synology/bk/ -maxdepth 1 -name 'bk-*' -mmin -60 -print0 | xargs -0 ls -1 -t 2>/dev/null | head -n 1

如果没有找到文件,该命令将返回当前目录中的文件...(命令执行的位置)

如果没有文件匹配,是否可以返回空输出?

谢谢

答案1

尝试 xargs 的 -r 选项

-r, --no-run-if-empty
               If the standard input does not contain any nonblanks, do not run the command.  Normally, the command is run once even if there is no input.  This option is a GNU extension.

答案2

除某些 BSD 外,当输入为空时,仍不带参数xargs cmd运行一次。 cmdGNU xargs(也引入了-0)有一个-r选项(现在也受到一些其他实现的支持)来避免这种情况。

现在,您的方法还存在一些其他问题:

  • 如果有大量文件,xargs会运行ls -t多次,所以你不会得到最新的文件,只是第一批的最新文件
  • 您没有将-d选项传递给ls这意味着如果这些文件中的任何一个是类型目录,它们的内容将被列出。
  • 您正在使用-print0/ xargs -0,它允许处理任意文件名,但是当您使用ls -t它不再输出 NUL 分隔的文件列表时,它就会被破坏。

在这里,您可以zsh在变得微不足道的地方使用:

newest=(/mnt/synology/bk/bk-*(Nmh-1om[1]))
if (($#newest)); then
  printf 'Newest: %s\n' $newest
else
  echo none found
fi

或者使用 GNU find(您可能正在使用-maxdepthGNU-mmin扩展)和//sort实现在其输入中支持 NUL 字符:cuthead

find /mnt/synology/bk -mindepth 1 -maxdepth 1 \
                      -name 'bk-*' -mmin -60 -printf '%T@/%p\0' |
  tr '\n\0' '\0\n' |
  sort -rn |
  cut -d/ -f2- |
  head -n1 |
  tr '\0' '\n'

(但请注意,与 相反zsh,如果后面的部分包含不形成有效字符的字节序列,find则可能无法找到某些文件)。bk-*bk-

相关内容