AJP*_*rez 2 ls solaris tar exit files
TL/DR:我在 Solaris 10 中工作。我有一个ls ... | egrep ...
命令,我需要知道它是否输出任何结果。我可以| wc -c
在末尾添加一个;但我需要结果(0 或非零)在退出代码中,而不是在输出中。而且我不能使用if
,它不是 bash 脚本,我只能执行一个命令。
长版:我正在编写一个维护过程来压缩和删除 Solaris 10 系统中的旧日志文件。它检查给定路径中的所有 .log 或 .xml 文件,获取给定月份最后修改的文件,用它们创建一个 .tar,然后删除原始文件:
ls -Egopqt /path/ | egrep -i '2016-10-[0123][0-9] .*(\.log$|\.xml$)' | awk '{ print $7 }'
| xargs tar -cvf target.tar
Run Code Online (Sandbox Code Playgroud)
与删除文件相同,只需将最后一部分替换为: | xargs -i rm {}
我可能把它复杂化了,但它有效。除非给定月份没有文件;如果是这种情况,我会收到一条错误消息tar: Missing filenames
。在尝试创建 tar 之前如何检查它?我想到了这样的事情,使用 wc 检查是否有输出:
ls ... | egrep ... | wc -c
Run Code Online (Sandbox Code Playgroud)
0
当没有任何文件时正确输出,否则输出另一个数字。问题是:我看不到输出,只有退出代码(由于没有错误,因此始终为 0)。我不是在 bash 脚本中执行此操作,而是使用 Siebel CRM:我有一个 javascript 函数,它生成命令并使用Clib.system调用执行它们。我唯一能看到的是退出代码:0
对于 OK,对于错误,非零(我看到的是实际数字,而不是“非零”)。
以前我有一个类似的要求,检查单个文件是否存在,这个答案帮助我解决了这个问题:
[ -f filename ] && exit 111 || exit 0
Run Code Online (Sandbox Code Playgroud)
根据文件名是否存在,我成功获得了111
或0
。但我无法让它与ls ... | egrep ... | wc
命令一起工作。我试过使用这种语法:
[[ $( ls -Egopq /path/ | egrep -i ... | wc -c ) -ne 0 ]] && exit 111 || exit 0
Run Code Online (Sandbox Code Playgroud)
但是我总是退出代码2,是否有文件并不重要。我究竟做错了什么?
PS:我知道我可以编写一个很小的 shell 脚本来执行检查,使用简单if
的比较输出,然后返回我想要的任何退出代码。另外,我实际上可以访问命令的输出,我只需要将它重定向到 a> tempfile
然后从 Siebel 读取它。但是,我更愿意避免这两个选项,因为我试图避免创建不必要的(临时或永久)文件。