Bash

通過正則表達式刪除文件

  • May 17, 2016

我想保留名稱匹配的文件[0-9A-Z]{1,2}_\d{4}_\w+?\.dat,例如 , A1_2001_pm23aD.datK_1998_12.dat並刪除其余文件。

但是,lsandrm命令不支持此類正則表達式。我怎樣才能做到這一點?

使用擴展的 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$'

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