我有一个这样的目录结构:
./
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 中运行该链,或者使用rename
或prename
重命名文件。