如何檢查’ls’是否輸出一些東西……用一個命令?
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
刪除文件也是如此,只需將最後一部分替換為:
| xargs -i rm {}
我可能過於復雜了,但**它確實有效。除非給定月份沒有文件;**如果是這種情況,我會收到一條錯誤消息
tar: Missing filenames
。在嘗試創建 tar 之前如何檢查它?我想到了這樣的事情,使用 wc 檢查是否有輸出:ls ... | egrep ... | wc -c
0
當沒有任何文件時正確輸出,否則輸出另一個數字。問題是:我看不到輸出,只有退出程式碼(因為沒有錯誤,所以始終為 0)。我不是在 bash 腳本中執行此操作,而是在使用 Siebel CRM:我有一個 javascript 函式,它生成命令並使用Clib.system呼叫執行它們。我唯一能看到的是退出程式碼:0
OK,非零表示錯誤(我看到的是實際數字,而不是“非零”)。以前我有一個類似的要求,檢查單個文件是否存在,這個答案幫助我做到了這一點:
[ -f filename ] && exit 111 || exit 0
我成功獲得
111
or0
,具體取決於文件名是否存在。但我無法讓它與ls ... | egrep ... | wc
命令一起使用。我試過使用這種語法:[[ $( ls -Egopq /path/ | egrep -i ... | wc -c ) -ne 0 ]] && exit 111 || exit 0
但是我總是得到退出程式碼2,是否有文件都沒有關係。我究竟做錯了什麼?
PS:我知道我可以編寫一個很小的 shell 腳本來執行檢查,使用一個簡單
if
的比較輸出,然後返回我想要的任何退出程式碼。另外,我實際上可以訪問命令的輸出,我只需要將它重定向到 a> tempfile
然後從 Siebel 讀取它。但是,我寧願避免這兩個選項,因為我試圖避免創建不必要的(臨時或永久)文件。
egrep
如果沒有匹配的行,則返回非零。
從
xargs
手冊:--no-run-if-empty -r 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.
似乎做
... | xargs -r tar -cvf target.tar
應該做的伎倆!