find /var/log/myfile.*.txt -type f
如果不存在與該模式匹配的文件,我會收到類似No such file or directory
.
問題:如何才能防止此錯誤訊息出現?我當然可以2>/dev/null
在末尾添加一個,但這會抑制任何錯誤。我怎麼能忽略提到的那個呢?
因為我有一個定期刪除一些文件的 cronjob,並且如果不存在文件則總是記錄錯誤:
@daily find /var/log/myfile.*.txt -mtime +7 -delete
答案1
在這種情況下,正確的做法是根本不觸發此訊息。
當你在 shell 中運行它時
find /var/log/myfile.*.txt -type f
/var/log/myfile.*.txt
被殼膨脹;如果沒有匹配,則find
取得擴充對像或文字。/var/log/myfile.*.txt
後一種情況會觸發No such file or directory
。
您可以先建立一個虛擬檔案:(touch '/var/log/myfile.dummy_name.txt'
比較開羅的大象)。但這個「解決方案」並不是很優雅。
更好的解決方案是處理find
模式:
find /var/log/ -type f -name "myfile.*.txt"
其中雙引號防止 shell 中的通配符(比較這)。在這種情況下*
由其自身處理,find
因為-name
支援此類模式。
然而上述方法可以myfile.*.txt
匹配任何子目錄的/var/log/
也是如此。如果您find
支持-maxdepth
,請使用它:
find /var/log/ -maxdepth 1 -type f -name "myfile.*.txt"
如果沒有,請看這個:將 POSIX 查找限製到特定深度?
您的作業系統可能已經用於logrotate(8)
管理日誌檔案。
在我的 Debian 中logrotate
每天都會運行,因為/etc/cron.daily/logrotate
; Ubuntu 中應該是類似的。我可以/etc/logrotate.d/
透過這種方式建立自訂配置並管理任意日誌檔案。考慮這種方法。