在 BASH 中使用特殊字符从文件名中批量删除子字符串

Posted

技术标签:

【中文标题】在 BASH 中使用特殊字符从文件名中批量删除子字符串【英文标题】:Batch remove substring from filename with special characters in BASH 【发布时间】:2015-09-24 00:21:00 【问题描述】:

我的目录中有一个文件列表:

opencv_calib3d.so2410.so
opencv_contrib.so2410.so
opencv_core.so2410.so
opencv_features2d.so2410.so
opencv_flann.so2410.so
opencv_highgui.so2410.so
opencv_imgproc.so2410.so
opencv_legacy.so2410.so
opencv_ml.so2410.so
opencv_objdetect.so2410.so
opencv_ocl.so2410.so
opencv_photo.so2410.so

它们是批量重命名所犯的一系列错误的产物,现在我不知道如何从它们中删除中间的“.so”。例如:

opencv_ocl.so2410.so 应该是opencv_ocl2410.so

这是我尝试过的:

# attempt 1, replace the (first) occurrence of `.so` from the filename
for f in opencv_*; do mv "$f" "$f#.so"; done

# attempt 2, escape the dot
for f in opencv_*; do mv "$f" "$f#\.so"; done

# attempt 3, try to make the substring a string
for f in opencv_*; do mv "$f" "$f#'.so'"; done

# attempt 4, combine 2 and 3
for f in opencv_*; do mv "$f" "$f#'\.so'"; done

但是所有这些都没有效果,产生错误消息:

mv: ‘opencv_calib3d.so2410.so’ and ‘opencv_calib3d.so2410.so’ are the same file
mv: ‘opencv_contrib.so2410.so’ and ‘opencv_contrib.so2410.so’ are the same file
mv: ‘opencv_core.so2410.so’ and ‘opencv_core.so2410.so’ are the same file
...

【问题讨论】:

【参考方案1】:

在你的mv 命令中试试这个:

mv "$f" "$f/.so/"

.so 的第一个匹配项正在被空字符串替换。

【讨论】:

太棒了。更简单的解决方案。【参考方案2】:
a='opencv_calib3d.so2410.so'
echo "$a%%.so*$a#*.so"
opencv_calib3d2410.so

地点:

$a%%.so* - 第一个.so之前的部分 $a#*.so - 第一个.so之后的部分

【讨论】:

@kdbanman 如果你的问题得到了回答,你应该这样标记。

以上是关于在 BASH 中使用特殊字符从文件名中批量删除子字符串的主要内容,如果未能解决你的问题,请参考以下文章

从文件名中批量删除“@2x”的 Bash 脚本/命令(视网膜图像 -> 正常)

使用 bash 脚本从输入字符串中过滤掉 ABC 字符、数字 123 和特殊字符

如何在 Redis 中批量删除数十万个带有特殊字符的键

如何在 Redis 中批量删除数十万个带有特殊字符的键

从文件名中删除特殊字符

如何从 Bash 中的路径字符串中删除文件后缀和路径部分?