特定パターンのファイル一覧表示

特定パターンのファイル一覧表示

次のパターンのいずれかという名前のファイルが複数あります。

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.単一の作成者ファイルに対して特別に処理されます)。

"-"(ただしそうではありません" - ")著者名に表示され、-タイトルと著者を区別する両方に常に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.'*
}

extglobksh拡張グローブのサブセットをサポートするには、を使用します。

  • *(x)(例:zshx#または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

関連情報