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
使用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
find
GNUの使用
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