Files

如何檢查’ls’是否輸出一些東西……用一個命令?

  • November 22, 2016

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呼叫執行它們。我唯一能看到的是退出程式碼:0OK,非零表示錯誤(我看到的是實際數字,而不是“非零”)。

以前我有一個類似的要求,檢查單個文件是否存在,這個答案幫助我做到了這一點:

[ -f filename ] && exit 111 || exit 0

我成功獲得111or 0,具體取決於文件​​名是否存在。但我無法讓它與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應該做的伎倆!

引用自:https://unix.stackexchange.com/questions/325216