Mac 터미널에서 정규식을 사용하여 폴더를 삭제하고 싶습니다.
0129_0140 (no delete)
0140_0140 (delete)
0150_0160 (no delete)
0170_0170 (delete)
0140_0140, 0170_0170 및 기타 폴더를 삭제하고 싶습니다.
(추가) 비어 있지 않은 폴더를 반복적으로 삭제하고 싶습니다.
답변1
비재귀적
사용 ksh93
(OS/X에서 사용 가능 ksh
):
rmdir {4}(\d)_\1
{4}(\d)_\1
(패턴과 일치하는 파일이 없으면 이름이 지정된 디렉터리가 삭제될 수 있습니다.)
사용 zsh
(OS/X에서 사용 가능 zsh
):
setopt extendedglob
rmdir [0-9](#c4)_[0-9]##(/e:'[[ ${REPLY%_*} = ${REPLY#*_} ]]':)
(이것의 또 다른 장점은 다음과 같은 유형의 파일만 가능하다는 것입니다.목차, /
위의 glob 한정자를 사용하여).
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 "$@"
( [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
BSD의 경우 find
(OS/X에서와 마찬가지로):
find . -maxdepth 1 -regex './\([0-9]\{4\}\)_\1' -type d -delete
GNU 사용 find
(macports/homebrew/fink를 통해 설치하지 않는 한 일반적으로 OS/X에서 찾을 수 없음...):
find . -maxdepth 1 -regextype grep -regex './\([0-9]\{4\}\)_\1' -type d -delete
재귀적으로:
ksh93
:set -o globstar rmdir -- **/{4}(\d)\1
1111_1111
(a가 있는 경우 glob 한정자(깊이 우선 순서) 없이 디렉터리가 있기 때문에 삭제할 수 없는 것을 먼저1111_1111/2222_2222
삭제하려고 시도하므로 삭제되지 않습니다 .)1111_1111
2222_2222
ksh93
od
zsh
zsh
:setopt extendedglob rmdir -- **/[0-9](#c4)_[0-9]##(Dod/e@'[[ ${${REPLY:t}%_*} = ${REPLY##*_} ]]'@)
BSD
find
:LC_ALL=C find . -regex '.*/\([0-9]\{4\}\)_\1' -type d -delete
그누
find
:LC_ALL=C find . -regextype grep -regex '.*/\([0-9]\{4\}\)_\1' -type d -delete
답변2
POSIX( 실제로 파일을 삭제 echo
하려면 삭제):echo rmdir
for dir in [0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]/; do
a="$(expr "$dir" : '\(.*\)_\1/')"
${a:+false} || echo rmdir "$dir"
done
또는:
for d in [0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]/; do
expr "$d" : '\(\(.*\)_\2\)/' >/dev/null && echo rmdir "$d"
done
또는:
set -- [0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]/
for d
do expr "$d" : '\(\(.*\)_\2\)/' >/dev/null && echo rmdir "$d"
done
답변3
이 시도:
find -type d -regextype posix-extended -regex '\./([0-9]{4})_\1' -delete
정규식 유형 설정이 필요합니다 {4}
.
답변4
한 쌍의 간단한 POSIX 호환 대안:
비재귀적(기본 이름에 줄바꿈이 허용되지 않음):
ls -F | grep '^\([0-9]\{4\}\)_\1/$' | xargs rm -fr
재귀:
find . -type d -exec expr {} : '.*/\([0-9]\{4\}\)_\1$' \; -prune \
-exec rm -fr {} + >/dev/null