특정 패턴의 파일 목록 표시

특정 패턴의 파일 목록 표시

다음 패턴 중 하나라는 이름의 파일이 여러 개 있습니다.

1    Surname, Name - Title. Subtitle.extension

2    Surname, N. Surname, N. - Title. Subtitle.extension

3    VV. AA. - Title. Subtitle.extension

(자막은 선택사항입니다)

각각 모드 1, 2 또는 3의 파일만 나열하면 됩니다. 예는 다음과 같습니다.

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

....... show filenames with one author:
Sloterdijk, Peter - parque humano.pdf
Aristóteles - Metafísica.epub
Zizek, Slavoj - Menos que nada. Hegel y la sombra del materialismo histórico.


....... show filenames with two authors:
Marx, K. Engels, F. - Capital I.epub
Deleuze, G. Guattari, F. - Mil mesetas.pdf

....... show filenames with "VV. AA.":
VV. AA. - Lógica Simbólica.pdf
VV. AA. - Fenomenología de la percepción. Ensayos sobre Merleau-Ponty.pdf

답변1

그리고 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

위의 전역 연산자는 다음과 같습니다.

  • #(regex와 동일 *) 이전 원자가 0회 이상 나타납니다.
  • (#c<min>,<mac>)(regex와 동일 {<min>,<max>})은 이전 원자의 최소 발생 횟수부터 최대 발생 횟수를 나타냅니다(참고, x(#c0,1)이 작업도 수행할 수 있습니다 (x|)).
  • pattern1~pattern2: 일치 패턴 1그리고는 아니다모드 2.
  • (...)그룹화하는 데 사용됩니다.
  • (ND:t)Nfor nullglob(일치하는 파일이 없으면 실패하지 않음), Dfor dotglob(숨겨진 파일 포함) 는 glob 한정자입니다. :t수정자는 다음으로만 확장됩니다.꼬리파일의 (기본 이름)입니다.

,이러한 필터 파일 이름은 첫 번째 발생 이전의 s 수를 기반으로 합니다 -(그리고 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.'*
}

extglobksh 확장 글로브의 하위 집합을 지원하려면 를 사용하세요 .

  • *(x)(예: zsh x#또는 regexp x*): 0개 이상 x.
  • ?(x)(예: zsh (x|)또는 x(#c0,1)ERE x?): 0 또는 1 x.
  • !(x)(예: zsh ^x): 일치하지 않는 모든 것 x.
  • 어느 것에서나 다음과 |같이 표현할 수 있습니다.또는.

zsh와 동일하게 pattern1~pattern2우리는 이것을 합니다 !(!(pattern1)|pattern2).

답변2

큰 타격:

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

관련 정보