文件名中时间字段的问题

文件名中时间字段的问题
cd /u01/saddy | printf '%s\n' "XYZ.ABC.V.$(date -d '2020-06-14 +1 day' +%Y%m%d)"*.batch ;

putty当我通过路径运行上述命令时,/u01/saddy该命令运行良好并给出预期的输出,即

XYZ.ABC.V.20200615180200.batch

但是当我尝试从主位置运行命令时,命令返回输出为

XYZ.ABC.V.20200615*.batch

所在位置的文件/u01/saddy是:

XYZ.ABC.V.20200615180200.batch,
XYZ.ABC.V.20200616190100.batch,
XYZ.ABC.V.20200617140200.batch.

答案1

cmd1 | cmd2

是从两个不同的进程同时运行cmd1cmd2输出通过管道cmd1连接到输入cmd2

所以:

cd /some/dir | printf '%s\n' some-glob

没有多大意义。这会更改某些(临时)进程的当前工作目录,同时在另一个进程中打印某些 glob 的扩展。

cd它发送to的输出printf,但首先cd不会打印任何内容²,而且无论如何printf也不会读取其输入。

想必您的意思是:

cd /some/dir && printf '%s\n' some-glob

也就是说,更改 shell 的工作目录,然后,如果cd成功,则打印该 glob 的扩展。

或者(要cd在单独的进程中完成,并printf在更改当前目录后从同一进程调用):

(cd /some/dir && printf '%s\n' some-glob)

(其中(...)启动一个子 shell 环境,通常通过分叉子 shell 进程来实现,其中对环境的更改(如 所做的那样)的cd范围仅限于那些内部(...))。


套接字对有一些贝壳

² 它可能在标准输出上打印某些内容的唯一情况是当您在设置时-作为参数(或-<n>/+<n>使用某些 shell)或无斜线参数传递时。$CDPATH

答案2

您尚未在“主位置”中显示文件内容,但我认为它不包含任何与模式匹配的文件

XYZ.ABC.V。约会时间。批

然而,在这种情况下,*shell 不会扩展 glob,而是会传递字面上地听从你的printf命令。这就是为什么你会得到你所描述的输出字符串。

如果你想避免这种情况,请尝试设置

shopt -s nullglob

然后,如果包含 a 的表达式*不匹配任何内容,它将扩展为空字符串而不是包含*字面意思。

但是,您已经从该行为中看到该cd命令的使用方式显然没有效果。您可能想更详细地解释什么你试图用命令来实现;那么也许贡献者可以帮助您找到更好的解决方案(关于为什么使用 a 的问题|,例如,已经在评论)。

相关内容