ファイル名のパターン置換

ファイル名のパターン置換

見つかったすべてのソリューションが私の場合には適していないため、質問を再作成する必要があります。多くのパディングを処理するときに、ファイル名への複数の置換を許可する単一行ユーティリティを使用したいと思います。入力ファイル名の形式です。

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

おすすめ記事