見つかったすべてのソリューションが私の場合には適していないため、質問を再作成する必要があります。多くのパディングを処理するときに、ファイル名への複数の置換を許可する単一行ユーティリティを使用したいと思います。入力ファイル名の形式です。
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
答え2
遅いのは、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./.}
ソートを無効にするためにここにglob修飾子を追加しました(#qoN)
。
答え3
touch 1300_grid12_04_lig_cne_767_lig.dlg
# if you have few
parallel mv {} '{= s/_grid12_04//; s/_lig.dlg/.dlg/ =}' ::: *.dlg
# if you have thousands
printf "%s\0" *.dlg |
parallel -0 mv {} '{= s/_grid12_04//; s/_lig.dlg/.dlg/ =}'
ls 1300*dlg