![文件名中时间字段的问题](https://linux22.com/image/176507/%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E6%97%B6%E9%97%B4%E5%AD%97%E6%AE%B5%E7%9A%84%E9%97%AE%E9%A2%98.png)
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
是从两个不同的进程同时运行cmd1
,cmd2
输出通过管道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 的问题|
,例如,已经在评论)。