ディレクトリ内のすべてのファイルで2つの数字の間のアンダースコアを削除する方法

ディレクトリ内のすべてのファイルで2つの数字の間のアンダースコアを削除する方法

つまり、ネストされたフォルダーを含むディレクトリがあり、ある時点で.png画像があります。

これらの画像の名前は「letters_numbers_numbers_letters.png」のようになっていますが、数字間のアンダースコアを削除したいと思います。

たとえば、 という名前のファイルがありa_1_2_b.png、それを に名前変更したいとしますa_12_b.png。次のようなものを使用する必要があることはわかっています。

find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`

しかし、この特定のアンダースコアを削除する方法を指定する方法がわかりません。触れたくない他の 2 つのアンダースコアがあることを覚えておいてください。

前もって感謝します!

答え1

perlの変形の1つを使用しますrename。たとえば、それです( renameDebian のようなシステムのパッケージ):

LC_ALL=C find . -name '*[0-9]_[0-9]*' -type f -exec rename -n -d '
  s/(?<=\d)_(?=\d)//g' {} +

-n満足したら(ドライラン)を削除します)。

を使用するとzsh、次の操作を実行できます。

autoload -Uz # best in ~/.zshrc
zmv -n  '(**/)(*[0-9]_[0-9]*)(#qD.)' \
        '$1${2//(#m)[0-9][_0-9]#[0-9]/${MATCH//_}}'

zsh glob には perl の look-around 正規表現演算子に相当するものがないため、少し複雑です。

これらは_、すべての通常のファイル名にある数字で囲まれたすべての を削除します (たとえば、dir_1_2_3/file_1_2_foo_22_3_4_barファイル名を に変更します)。dir_1_2_3/file_12_foo_2234_bar

_パターンに従う通常のファイルで2 番目だけを削除するにはletters_digits_digits_letters.png、次のようにします。

zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
       '$1$2$3'

関連情報