名前に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
    

答え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

関連情報