Удалите папки, имена которых имеют четырехзначные числа дважды

Что внутри mdadm.conf, используемого в Debian и Gentoo?

В частности, что используется для строки DEVICE. Если она указывает на какое-то медленное устройство или опущена, то mdadm будет очень долго выполнять зондирование.

Например, в моей системе есть пара устройств /dev/sdX, которые соответствуют устройствам чтения SD-карт, встроенным в мои мониторы. Они присутствуют независимо от наличия вставленных SD-карт, и их поиск занимает ненулевое количество времени.

Вам следует сузить круг поиска, если это возможно.

Также стоит проверить версию mdadm.

5
10.02.2016, 13:08
4 ответа

Нерекурсивный

С 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 найдите (как найдено в OS / X):

find . -maxdepth 1 -regex './\([0-9]\{4\}\)_\1' -type d -delete

С GNU найдите (обычно не встречается в OS / X, если не установлен через macports / homebrew / fink ...):

find . -maxdepth 1 -regextype grep -regex './\([0-9]\{4\}\)_\1' -type d -delete

Рекурсивно:

  • ksh93 :

     set -o globstar 
    rmdir - ** / {4} (\ d) \ 1 
     

    (имейте в виду, что он не удалит 1111_1111 , если есть 1111_1111 / 2222_2222 , так как он попытается сначала удалить 1111_1111 , что не может в нем есть каталог 2222_2222 , ksh93 не имеет квалификатора od glob (для порядка глубины) 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' -тип d -delete 
     
  • GNU найти :

     LC_ALL = C найти. -regextype grep -regex '. * / \ ([0-9] \ {4 \} \) _ \ 1' -type d -delete 
     
12
27.01.2020, 20:32

Попробуйте следующее: настройка типа регулярного выражения

find -type d -regextype posix-extended -regex '\./([0-9]{4})_\1' -delete

необходима для {4} .

1
27.01.2020, 20:32

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
2
27.01.2020, 20:32

Пара простых, совместимых с 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
1
27.01.2020, 20:32

Теги

Похожие вопросы