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

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

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

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

関連情報