删除名称为 4 位数字的文件夹两次

jak*_*ung 5 regular-expression

我想在 Mac 终端中使用正则表达式删除文件夹。

0129_0140 (no delete)
0140_0140 (delete)
0150_0160 (no delete)
0170_0170 (delete)
Run Code Online (Sandbox Code Playgroud)

我只想删除 0140_0140 、 0170_0170 等文件夹。

(添加)我想递归删除非空文件夹。

Sté*_*las 12

非递归

使用ksh93(在 OS/X 上可用ksh):

rmdir {4}(\d)_\1
Run Code Online (Sandbox Code Playgroud)

(请注意,{4}(\d)_\1如果没有与该模式匹配的文件,它可能会删除一个名为的目录)。

使用zsh(在 OS/X 上可用zsh):

setopt extendedglob
rmdir [0-9](#c4)_[0-9]##(/e:'[[ ${REPLY%_*} = ${REPLY#*_} ]]':)
Run Code Online (Sandbox Code Playgroud)

(使用上面的glob 限定符,该方法还具有仅考虑directory类型的文件的好处/)。

使用bash或其他 POSIX 外壳(如sh大多数系统的外壳,包括OS/X):

set -- [0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]
for f do
  [ "${f#*_}" = "${f%_*}" ] && set -- "$@" "$f"
  shift
done
rmdir "$@"
Run Code Online (Sandbox Code Playgroud)

(请注意,[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]如果XXXX_XXXX当前目录中没有文件,它可能会删除一个名为的目录)。

使用findgrep

find . ! -name . -prune -type d -name '[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]' |
  grep -x '\./\(.*\)_\1' |
  xargs rmdir
Run Code Online (Sandbox Code Playgroud)

使用 BSD find(在 OS/X 上找到):

find . -maxdepth 1 -regex './\([0-9]\{4\}\)_\1' -type d -delete
Run Code Online (Sandbox Code Playgroud)

使用 GNU find(通常在 OS/X 上找不到,除非通过 macports/homebrew/fink 安装...):

find . -maxdepth 1 -regextype grep -regex './\([0-9]\{4\}\)_\1' -type d -delete
Run Code Online (Sandbox Code Playgroud)

递归地: