ディレクトリ内のすべてのファイルから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のツアー正規表現演算子と同等のものがないため、少し複雑です。

これは_、すべての一般的なファイル名から数字で囲まれたすべてのsを削除します(たとえば、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'

おすすめ記事