如何重命名当前文件夹中的所有文件和目录?

如何重命名当前文件夹中的所有文件和目录?

我有一个这样的目录结构:

./
  whatever/
    foos_whatever.ext
  something/
    foo/
      1.ext
      2.ext
  another/
    foo.ext

我想重命名所有文件包含 的目录foo。我想foo用替换bar

这是我正在尝试的:

[naomi ~/app]$ find . -name '*foo*' -exec f={} && mv -v f ${f/foo/bar} \;

这是我收到的错误:

find: -exec: no terminating ";" or "+"

谢谢你的帮助 :D

答案1

我认为最明显的方式是这样的:

find -name "*foo*" -exec rename s/foo/bar/ {} \;

或者使用 xargs,如果您有很多文件需要重命名:

find -name "*foo*" | xargs -I '{}' rename s/foo/bar/ '{}'

然而,问题在于,如果你有一个如下所示的目录结构:

.
|-- fooDir
|   |-- foo.txt
|   `-- abc
`-- foo2

重命名 foo.txt 会失败,因为它会先将 fooDir 重命名为 barDir,然后声称不再找到“fooDir/foo.txt”

只需重新运行命令直到没有错误即可,但这样做很不妥。另一种方法是循环运行命令,对目录树的每个深度级别运行一次,并使用选项find-mindepth设置-maxdepth为排除其他级别,但您必须知道目录系统的深度。

我想不出更好的办法了。

答案2

您不能在 中使用这样的命令链-exec,因为 shell 会将它们解释为find自身的延续。请在子 shell 中运行该链,或者使用renameprename重命名文件。

相关内容