이름에 2개의 4자리 숫자가 포함된 폴더 삭제

이름에 2개의 4자리 숫자가 포함된 폴더 삭제

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

사용 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

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_11112222_2222ksh93odzsh

  • 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

관련 정보