[英]Regex to find the files without .log extension and containing the filename report
我正在嘗試查找當前目錄中包含名稱報告且不以擴展名.log結尾的所有文件,有什么方法可以使用正則表達式一次找到相同文件?
到目前為止,這是我想出的:
ls -la | grep ".*report*" | grep -v ".log"
但是我想知道我是否可以在下面這樣的線上實現相同的目標
ls -l .*report*[^.log]
我知道[^ .log]不會過濾掉.log擴展名的文件,如何使用正則表達式實現相同的目的。 我正在使用BASH。 謝謝。
你可以說:
find . -type f \( -name "*report*" -a ! -name "*.log" \)
這將在當前目錄和所有子目錄中找到與模式report
匹配的文件,並排除以.log
結尾的文件。
如果只想在當前目錄中查找,則可以說:
find . -maxdepth 1 -type f \( -name "*report*" -a ! -name "*.log" \)
您可以為此使用extglob。 例如:
shopt -s extglob nullglob
files=( report!(*.log) )
...當然,您可以使用ls
進行測試(盡管不應在腳本中使用 ):
shopt -s extglob
ls -l report!(*.log)
...將找到所有以report
開頭但不以.log
結尾的文件,並將它們的名稱放在名為files
的數組中。 如果沒有文件匹配,則設置nullglob
選項將防止結果返回模式本身。
然后,您可以執行以下操作來檢查數組的內容:
if (( ${#files[@]} )); then
echo "Found some files that need to be deleted!"
rm -f "${files[@]}"
else
echo "Nothing but .log files for the reports"
fi
這是擴展的glob模式( shopt -s extglob
命令將其打開; shopt -u extglob
再次將該擴展名關閉),而不是正則表達式。 (類似*.log
表達式也是glob模式,不是正則表達式;類似的正則表達式看起來像.*[.]log
,這不是您在shell中使用的表達式)。
如果仍然要在這些文件上進行循環,則跳過循環頂部的日志很簡單。
for f in *report*; do
case $f in *.log ) continue ;; esac
:
: do stuff with "$f" here
done
請注意,大多數case
都應在雙引號中正確使用"$f"
,但在case
則不必要。
你可以做:
ls -ld !(*.log)
這將顯示當前文件夾中所有不以.log
結尾的文件/目錄。
據我所知,沒有辦法過濾兩個都include *report*
+ exclude .log
因此,通常,最干凈的方法是:
ls -ald *report* | grep -v '\.log'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.