見つかったすべてのソリューションが私の場合には適していないため、質問を再作成する必要があります。多くのパディングを処理するときに、ファイル名への複数の置換を許可する単一行ユーティリティを使用したいと思います。入力ファイル名の形式です。
1300_grid12_04_lig_cne_767_lig.dlg
予想される結果は次のとおりです。
130004_lig_cne_767.dlg
だから、各ファイルに対して2つのパターンを置き換える必要があります。」グリッド 12これは大量のパディングを処理するのに非常に遅い方法です。
# 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 コマンドを試しましたが、パターンを正しく認識しません。
rename 's/_grid12_/_/g' *.dlg
これを素早く実行するためにループパディングを避けることは可能ですか?
ベストアンサー1
これにより、各ファイルの名前を最後の名前に直接変更するよりもループ速度が2倍速くなります。
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