名前に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#*_} ]]':)

(これのもう1つの利点は、次の種類のファイルしか利用できないことです。目次/上記の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

findGNUの使用

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
    

おすすめ記事