Bash

根據模式對文件進行排序

  • October 15, 2020

我正在處理具有固定名稱結構的大量填充的管理,採用由_分隔的多列格式:

3000_12_lig_cne_158.dlg
1300_10_lig_cne_983.dlg
4000_09_lig_cne_158.dlg
5000_09_lig_cne_158.dlg
7000_09_lig_cne_158.dlg
10V1_06_lig_cne_983.dlg
10V2_11_lig_cne_158.dlg
N000_12_lig_cne_158.dlg
M000_10_lig_cne_158.dlg
E000_10_lig_cne_158.dlg

所以第一列可以包含四個數字(如 7000)或數字和字母的組合(如 N000 或 10V1)。

使用一些 bash 常式,我必鬚根據第一列名稱對所有這些填充進行排序,為每個曲目創建與第一列名稱匹配的子目錄。因此,對於展示的填充列表,應創建總共 10 個目錄(3000、1300、E000、M000、10V1、10V2 等)。

對於第一列中只有數字編號的填充,我可以使用以下路由,它在 FOR 循環中使用正則表達式對填充進行排序。

for i in ${FILES}/[0-9]*_*.dlg        # match the filles containing only digits in the first column
do 
   j=${i##*/}               # strip the path off from beginning to last /
   mkdir -p $OUTPUT/${j%%_*}        # create dir with the name matching the first column of the file
   mv $i $OUTPUT/${j%%_*} # move the file to the corresponded directory
done

我如何修改它以匹配第一列的所有展示模式?

如果您只需要四個字元,請使用?一個字元四次:

for dlg in "$FILES"/????_*.dlg 

使用zsh(您的腳本已經在zsh語法中,而不是bash因為您沒有引用參數擴展):

autoload zmv # best in ~/.zshrc

zmodload zsh/files # makes mkdir and mv (and a few other file manipulation
                  # utilities) builtin to speed things up.

mkmv() { mkdir -p -- $2:h && mv -- "$@"; }

(
 cd -P -- "$FILES" &&
   zmv -P mkmv '([A-Z0-9](#c4))_*.dlg' '$1/$f'
)

Where[A-Z0-9](#c4)匹配 4 個英文大寫字母(並且zsh僅在 , 它們中,而不是 Ŕ, Æ, 🆘, 等其他 shell 通常會包含在那裡)或十進制數字(同樣,它們僅匹配,而不是², 🆢, 𝍤bash例如包括)。

請注意,您[0-9]*_*.dlg不是0正則表達式,它是一個 shell 萬用字元,它​​匹配以to9範圍中的一個字元開頭的文件名(bash在大多數語言環境中包括數百個字元),後跟任意數量的字元 ( *),後跟_後跟任意數量的字元,後跟.dlg. 正則表達式等效項是^[0-9].*_.*\.dlg$.

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