所以我有一个带有嵌套文件夹的目录,并且在某些时候还有.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>`
但我不确定如何指定如何删除这个特定的下划线。请记住,还有另外两个下划线我不想碰。
提前致谢!
答案1
perl
使用s的变体之一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 的环视正则表达式运算符的等效项。
这些删除了_
每个常规文件名称中由数字包围的所有 s(例如将dir_1_2_3/file_1_2_foo_22_3_4_bar
文件重命名为)。dir_1_2_3/file_12_foo_2234_bar
_
要仅删除遵循该模式的常规文件中的第二个letters_digits_digits_letters.png
,只需:
zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
'$1$2$3'