Bash
通過正則表達式刪除文件
我想保留名稱匹配的文件
[0-9A-Z]{1,2}_\d{4}_\w+?\.dat
,例如 ,A1_2001_pm23aD.dat
,K_1998_12.dat
並刪除其余文件。但是,
ls
andrm
命令不支持此類正則表達式。我怎樣才能做到這一點?
使用擴展的 glob:
shopt -s extglob printf '%s\n' !([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)
這將列印所有不 (
!
) 匹配的文件/目錄名稱,[[:digit:][:upper:]]
後跟 0 或 1[[:digit:][:upper:]]
,後跟s[[:digit:]]
之間的 4,然後在 extension 之前的_
1 或多個。 如果要遞歸搜尋:[[:alnum:]]``.dat
shopt -s globstar shopt -s extglob printf '%s\n' **/!([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)
或者,使用
gnu find
(您可以使用正則表達式):find . -regextype egrep ! -regex '.*/[[:digit:][:upper:]]{1,2}_[[:digit:]]{4}_[[:alnum:]]+\.dat$'