正規表現置換を使用して結果のファイル名を計算する perl ワンライナーを採用したいと思います。ドライランを実行して結果を単に印刷すると、望ましい結果が得られます(まだ引用符はありません):
for i in *_\ *; do echo "${i}" $(perl -ne 'print s/(?<![_ ])_ /-/gr' <<< "${i}"); done
しかし、それに変更するmv
と壊れます:
for i in *_\ *; do mv "${i}" $(perl -ne 'print s/(?<![_ ])_ /-/gr' <<< "${i}"); done
mv: target ‘9781430249146.pdf’ is not a directory
どうやら perl の出力が再解釈され、空白が問題を引き起こしているようです。二重引用符で囲むと、perl コードが最初に bash によって評価されるため、別の問題が発生します。
for i in *_\ *; do mv "${i}" "$(perl -ne 'print s/(?<![_ ])_ /-/gr' <<< "${i}")"; done
-bash: ![_: event not found
(コマンド自体ではなく) コマンド置換からの出力だけを引用する方法はありますか?