次のパターンのいずれかという名前のファイルが複数あります。
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.
単一の作成者ファイルに対して特別に処理されます)。
"-"
(ただしそうではありません" - "
)著者名に表示され、-
タイトルと著者を区別する両方に常に1つ以上の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