показать список файлов с определенным шаблоном

Похоже, что я удалил не все файлы, которые принадлежали неудачной резервной копии. Теперь, когда я их удалил, резервное копирование возобновилось как обычно.

2
06.01.2021, 06:57
2 ответа

Сzsh:

set -o extendedglob
one-author()   print -rC1 - ~/books/(([^,-]#,)(#c0,1)[^,-]#~'VV. AA.'*)-*(ND:t)
two-authors()  print -rC1 - ~/books/([^,-]#,)(#c2)[^,-]#-*(ND:t)
vv-aa-author() print -rC1 - ~/books/'VV. AA.'*(ND:t)

Тогда:

$ one-author
Aristóteles - Metafísica.epub
Sloterdijk, Peter - parque humano.pdf
Zizek, Slavoj - Menos que nada. Hegel y la sombra del materialismo histórico.
$ two-authors
Deleuze, G. Guattari, F. - Mil mesetas.pdf
Marx, K. Engels, F. - Capital I.epub
$ vv-aa-author
VV. AA. - Fenomenología de la percepción. Ensayos sobre Merleau-Ponty.pdf
VV. AA. - Lógica Simbólica.pdf

Приведенные выше операторы глобуса::

  • #(эквивалентно регулярному выражению*)для 0 или более вхождений предыдущего атома
  • (#c<min>,<mac>)(эквивалентно регулярному выражению{<min>,<max>})для минимального и максимального количества вхождений предыдущего атома (обратите внимание, что для x(#c0,1)мы также можем сделать(x|)).
  • pattern1~pattern2:соответствует шаблону 1 и не соответствует шаблону 2.
  • (...)используется для группировки.
  • (ND:t)является квалификатором glob, Nдляnullglob(не сбой, если нет соответствующего файла ), Dдляdotglob(включает скрытые файлы ), :tмодификатор только для расширения к хвосту(базовому имени )файла.

Эти фильтруют имена файлов на основе количества ,с до первого появления-(и обработки VV. AA.специально для одного -автора ).

Если "-"(, но не" - ")может встречаться в имени автора, и всегда есть по крайней мере один SPC с обеих сторон -, который отделяет автора от названия, вы можете изменить его на:

set -o extendedglob
one-author()   print -rC1 - ~/books/(([^,]#,)(#c0,1)[^,]#~'VV. AA.'*~*' - '*)' - '*(ND:t)
two-authors()  print -rC1 - ~/books/(([^,]#,)(#c2)[^,]#~*' - '*)' - '*(ND:t)
vv-aa-author() print -rC1 - ~/books/'VV. AA.'*(ND:t)

С оболочкой bashвы можете сделать что-то эквивалентное с:

shopt -s nullglob dotglob extglob
print-tails() {
  (( $# == 0 )) || printf '%s\n' "${@##*/}"
}
one-author() {
  print-tails ~/books/!(!(?(*([^,]),)*([^,]))|'VV. AA.'*|*' - '*)' - '*
}
two-authors() {
  print-tails ~/books/!(!(*([^,]),*([^,]),*([^,]))|*' - '*)' - '*
}
vv-aa-authors() {
  print-tails ~/books/'VV. AA.'*
}

С помощью extglobподдерживается подмножество расширенных глобусов ksh:

  • *(x)(как zsh x#или регулярное выражениеx*):0 или более xs.
  • ?(x)(аналогично zsh (x|)или x(#c0,1)или EREx?):0 или 1 x.
  • !(x)(как zsh^x):все, что не соответствует x.
  • внутри любого из них |может использоваться для обозначения или .

Как эквивалент zsh's pattern1~pattern2,мы делаем !(!(pattern1)|pattern2).

2
18.03.2021, 22:38

баш:

declare -a vv one two

for file in *; do 
    authors=${file%% - *}
    case $authors in
        'VV. AA.') vv+=("$file") ;;
        *)  authors=${authors//, /}
            IFS=' ' read -ra names <<<"$authors"
            (( ${#names[@]} == 1 )) && one+=("$file") || two+=("$file")
            ;;
    esac
done

declare -p one two vv

выходы

declare -a one=([0]="Aristóteles - Metafísica.epub" [1]="Sloterdijk, Peter - parque humano.pdf" [2]="Zizek, Slavoj - Menos que nada. Hegel y la sombra del materialismo histórico.")
declare -a two=([0]="Deleuze, G. Guattari, F. - Mil mesetas.pdf" [1]="Marx, K. Engels, F. - Capital I.epub")
declare -a vv=([0]="VV. AA. - Fenomenología de la percepción. Ensayos sobre Merleau-Ponty.pdf" [1]="VV. AA. - Lógica Simbólica.pdf")

Если вы хотите интерактивное меню:

PS3="Select authorship: "
select category in One Two VV quit; do
    case $category in
        One) printf "%s\n" "${one[@]}" ;;
        Two) printf "%s\n" "${two[@]}" ;;
        VV)  printf "%s\n" "${vv[@]}"  ;;
        quit) break ;;
    esac
done
1
18.03.2021, 22:38

Теги

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