つまり、ネストされたフォルダーを含むディレクトリがあり、ある時点で.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
。たとえば、それです( rename
Debian のようなシステムのパッケージ):
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'