다음 패턴 중 하나라는 이름의 파일이 여러 개 있습니다.
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)
N
fornullglob
(일치하는 파일이 없으면 실패하지 않음),D
fordotglob
(숨겨진 파일 포함) 는 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.'*
}
extglob
ksh 확장 글로브의 하위 집합을 지원하려면 를 사용하세요 .
*(x)
(예: zshx#
또는 regexpx*
): 0개 이상x
.?(x)
(예: zsh(x|)
또는x(#c0,1)
EREx?
): 0 또는 1x
.!(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