【问题标题】:Rename a portion of a filename recursively throughout directory and sub directory [duplicate]在整个目录和子目录中递归地重命名文件名的一部分[重复]
【发布时间】:2022-01-09 16:34:06
【问题描述】:

如何让这个命令在子目录中也执行?

for filename in *foo*; do mv "$filename" "${filename//foo/bar}"; done

【问题讨论】:

  • 您是否尝试过使用 globstar 模式 ** 递归到子目录,如下所示:**/*foo*?您可能必须先启用此功能,然后才能使用它:shopt -s globstar
  • globstar 选项设置为shopt -s globstar,然后将*foo* 替换为**/*foo*
  • 但请注意,您应该检查这是否符合您的预期,例如通过在mv 之前放置一个echo
  • 就像 Xoozee 说的,或者至少做一个mv -iv ....

标签: linux bash command


【解决方案1】:

您可能只想重命名文件名(最后一个路径名组件),而不是中间的子目录名称。那么这个任务就可以使用 bash 的globstar 特性来完成了。

#!/bin/bash

shopt -s globstar
for pathname in ./**/*foo*; do
    [[ -f $pathname ]] || continue
    basename=${pathname##*/}
    mv "$pathname" "${pathname%/*}/${basename//foo/bar}"
done

【讨论】:

  • 确实如此,并且检查您正在重命名文件而不是目录也是一个好主意。
  • @Fravadona 够公平
  • 这成功了,是的,它用于文件名而不是目录名。谢谢!
猜你喜欢
  • 2013-12-05
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2018-11-26
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多