linux - 如何在不使用重命名命令的情况下递归搜索目录并从文件名中删除开/关括号?
问题描述
我有一个问题,我需要从磁盘上的每个文件名中删除所有打开的 [ 和关闭 ] 括号。该解决方案必须在没有可用重命名命令的系统上工作。
对于如下所示的示例文件结构:
/file [name].ext
/test[file].example
/nobracket.nrml
/path/to/subdirectory/deep [bracket].test
/[test] brackets with - spaces.sample
我需要结果看起来像:
/file name.ext
/testfile.example
/no bracket.nrml
/path/to/subdirectory/deep bracket.test
/test brackets with - spaces.sample
我尝试过的 2 种方法中的 1 种:
for i in `find . -type f -name '*[*'` ; do mv $i `echo $i | sed 's/\[//g'` ; done
它挂起带有空格的文件,并且除了不执行重命名之外,还提供以下输出:
mv: can't rename './[test]': No such file or directory
mv: can't rename 'brackets': No such file or directory
mv: can't rename 'with': No such file or directory
mv: can't rename '-': No such file or directory
mv: can't rename 'spaces.sample': No such file or directory
我尝试过的 2 种方法中的 2 种:
find . -type f -name '*[*' -exec sed 's/[][]//g' {} \+
除了不重命名文件之外,这种方法还向标准输出返回奇数输出,如下所示:
ȏkgn7Y{/ fpu(?{yw-M^?}r& @n
cȌ ; @vk@ș<1㙀9'{ݥfn7y`L}|t;&! x|}{1r '@r '@r '@r '@r '@r '@r '@r '@r{=?>hO)& @N @N @N @N9>wx/& @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N @N89W=CZzǏhjss6ju@7W?Gub
任何有关如何解决此问题的见解将不胜感激!单线将是理想的,但对其他解决方案持开放态度。
解决方案
由于您的文件名有空格,因此您需要引用命令替换。否则,它将被解析为多个参数。
此外,您对 的输出也有同样的问题find
,它在空格处被for
. 将其通过管道传输到while read
循环而不是使用for
.
没有必要使用sed
,因为bash
有一个内置的替换运算符。此运算符采用通配符模式进行查找,因此您可以使用它[\[\]]
来匹配任一方括号。
find . -type f -name '*[*' | while read -r f; do
mv "$f" "${f//[\[\]]/}"
done
推荐阅读
- java - 按 Ctrl+A 正在更改 JTextPane 中的字体
- c - 用户输入的正奇数值小于 20 的 C 中的钻石打印
- android - android中挂起的线程是什么意思?
- javascript - 在完整日历中显示带有日期和时间的事件
- java - Firebase 助手错误:无法解决:firebase-messaging-15.0.0
- java - 在 Spring 中使用 Thymeleaf 获取表单数据时如何禁用空格修剪
- python - 使用集合(列表)理解的对称集合差异未给出预期结果
- javascript - 为什么循环不在定义的停止点停止?
- react-native - 如何播放来自 wistia、youtube、驱动器的视频?
- ruby-on-rails - 从 github 安装 gem 时出现捆绑问题