如何在不使用重命名命令的情况下递归搜索目录并从文件名中删除开/关括号? [复制]
Posted
技术标签:
【中文标题】如何在不使用重命名命令的情况下递归搜索目录并从文件名中删除开/关括号? [复制]【英文标题】:How do I recursively search through directories and remove open/close brackets from filenames without using the rename command? [duplicate] 【发布时间】:2021-05-29 07:28:28 【问题描述】:我有一个问题,我需要从磁盘上的每个文件名中删除所有打开 [ 和关闭 ] 括号。该解决方案必须在没有可用的重命名命令的系统上工作。
对于一个看起来像这样的示例文件结构:
/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
非常感谢任何有关如何解决此问题的见解!单线是理想的,但对其他解决方案持开放态度。
【问题讨论】:
使用rename
命令。它有一个递归选项。
【参考方案1】:
由于你的文件名有空格,你需要引用命令替换。否则,它将被解析为多个参数。
另外,find
的输出也有同样的问题,for
在空白处将其拆分为单独的名称。将其通过管道传送到while read
循环,而不是使用for
。
没有必要使用sed
,因为bash
有一个内置的替换运算符。该运算符采用通配符模式进行查找,因此您可以使用 [\[\]]
匹配任一方括号。
find . -type f -name '*[*' | while read -r f; do
mv "$f" "$f//[\[\]]/"
done
【讨论】:
感谢您指出为什么我尝试过的解决方案不起作用。您的解决方案非常适合仅替换 [ 但我希望有一个可以做到 [ 和 ] 的一体机。有没有办法用这种替换方法做到这一点? 我已经更新了答案以显示如何替换两个括号。以上是关于如何在不使用重命名命令的情况下递归搜索目录并从文件名中删除开/关括号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章