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当前目录中没有文件,它可能会删除一个名为的目录)。
使用find和grep:
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)
ksh93:
set -o globstar
rmdir -- **/{4}(\d)\1
Run Code Online (Sandbox Code Playgroud)
(请注意,1111_1111如果有一个1111_1111/2222_2222,它不会删除,因为它会尝试首先删除1111_1111它不能删除的那个,因为其中有一个2222_2222目录,ksh93没有odglob 限定符(用于深度优先顺序)zsh)
zsh:
setopt extendedglob
rmdir -- **/[0-9](#c4)_[0-9]##(Dod/e@'[[ ${${REPLY:t}%_*} = ${REPLY##*_} ]]'@)
Run Code Online (Sandbox Code Playgroud)BSD find:
LC_ALL=C find . -regex '.*/\([0-9]\{4\}\)_\1' -type d -delete
Run Code Online (Sandbox Code Playgroud)GNU find:
LC_ALL=C find . -regextype grep -regex '.*/\([0-9]\{4\}\)_\1' -type d -delete
Run Code Online (Sandbox Code Playgroud)