Linux

顯示具有特定模式的文件列表

  • January 6, 2021

我有很多文件命名為這些模式之一:

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

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

上面的 glob 運算符是:

  • #(相當於 regex *)0 次或多次出現的前一個原子
  • (#c<min>,<mac>)(相當於 regex {<min>,<max>})用於前一個原子的 min 到 max 出現(注意,x(#c0,1)我們也可以這樣做(x|))。
  • pattern1~pattern2: 匹配 pattern1而沒有pattern2。
  • (...)用於分組。
  • (ND:t)是一個 glob 限定符,Nfor nullglob(如果沒有匹配的文件,不要失敗),Dfor dotglob(包括隱藏文件),: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)

使用bashshell,您可以執行以下操作:

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 的擴展 glob 的一個子集:

  • *(x)(如 zshx#或 regexp x*):0 個或多個xs。
  • ?(x)(如 zsh(x|)x(#c0,1)ERE x?):0 或 1 x
  • !(x)(如 zsh 的^x):任何不匹配的東西x
  • 在其中任何一個中,|都可以用來表示

作為zsh‘s的等價物pattern1~pattern2,我們這樣做了!(!(pattern1)|pattern2)

引用自:https://unix.stackexchange.com/questions/627749