Linux
顯示具有特定模式的文件列表
我有很多文件命名為這些模式之一:
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 限定符,N
fornullglob
(如果沒有匹配的文件,不要失敗),D
fordotglob
(包括隱藏文件),: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
shell,您可以執行以下操作: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#
或 regexpx*
):0 個或多個x
s。?(x)
(如 zsh(x|)
或x(#c0,1)
EREx?
):0 或 1x
。!(x)
(如 zsh 的^x
):任何不匹配的東西x
。- 在其中任何一個中,
|
都可以用來表示或。作為
zsh
‘s的等價物pattern1~pattern2
,我們這樣做了!(!(pattern1)|pattern2)
。