在 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
运行一次。 cmd
GNU 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
(您可能正在使用-maxdepth
GNU-mmin
扩展)和//sort
实现在其输入中支持 NUL 字符:cut
head
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-