Bash
文件名的模式替換
我必須再次提出我的問題,因為找到的所有解決方案都不適用於我的情況。處理許多填充我想使用一些單行實用程序,它允許在文件名中進行多次替換。這是輸入文件名稱的格式
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 限定符來禁用排序。