簡體   English   中英

正則表達式查找不帶.log擴展名並包含文件名報告的文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM