Bash

文件名的模式替換

  • October 13, 2020

我必須再次提出我的問題,因為找到的所有解決方案都不適用於我的情況。處理許多填充我想使用一些單行實用程序,它允許在文件名中進行多次替換。這是輸入文件名稱的格式

1300_grid12_04_lig_cne_767_lig.dlg

這是預期的輸出:

130004_lig_cne_767.dlg

因此,對於每個文件,我必須將兩個模式“ grid12 ”替換為“_”和“_lig”。至 ”。” 對於填充的集合,我可以手動使用兩個後續循環來實現它,這是處理大量填充的非常慢的方法。

# 1st loop over the files and substitute patter _grid12_ to _.
for file in ./*.dlg; do mv -v "$file" "${file/_grid12_/_}"; done
# 2nd loop these filles to substitute _lig. to .
for file in ./*.dlg; do mv -v "$file" "${file/_lig./.}"; done

我已經嘗試過重命名命令,它不能正確辨識模式:

rename 's/_grid12_/_/g' *.dlg

是否可以避免在填充物上循環以快速完成?

這應該會加速循環兩次,因為它將每個文件直接重命名為最終名稱。

for file in ./*.dlg; do
   new=${file/_grid12_/_}
   mv -v "$file" "${new/_lig./.}"
done

您可能可以通過並行執行重命名獲得一些加速(但 IO 可能很容易成為瓶頸):

cpu_tally=$(grep -c ^processor /proc/cpuinfo)
for file in ./*.dlg; do
   new=${file/_grid12_/_}
   printf '%s\0' "$file" "${new/_lig./.}"
done  | xargs -r0 -n2 -P$cpu_tally -exec mv -v

mv緩慢的是為每個文件執行獨立實用程序。您可以切換到可以內置實用程序的zsh位置:mv

zmodload zsh/files # makes mv and a few other file manipulation utilities builtin
autoload -Uz zmv   # batch renaming tool
zmv -v '*.dlg' '${${f/_grid12_/_}/_lig./.}'

zmv在一個簡單的循環上具有額外的功能。例如,如果發現衝突,它將在開始重命名之前中止。

簡單的循環可能是:

for f (*.dlg(#qoN)) mv -vi -- ${${f/_grid12_/_}/_lig./.}

這裡還添加了一個(#qoN)glob 限定符來禁用排序。

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