如何在 ubuntu 中以递归方式使用 grep 和 rename not find 重命名文件?

如何在 ubuntu 中以递归方式使用 grep 和 rename not find 重命名文件?

关于如何重命名文件,有无数的问题和答案。我是 Linux 新手,这么多可能的方法、不同的结果和不同的配置让我感到困惑。

例如:

  • rename有效,但不是递归的
  • grep以递归方式工作,但不能用于搜索文件和目录名称,而是文件内容
  • find可以工作,但是当您想要使用正则表达式搜索时,语法会很长很丑陋。

还有许多关于询问 Ubuntu堆栈溢出对我来说不起作用,而且我不知道如何调试和排除故障。

所以,请原谅我再问一次。

我正在寻找一个干净的,可记忆的的方法:

使用简单正则表达式递归重命名文件

我已经使用以下语法对文件内容进行了此操作:

grep -rl search_regex | xargs sed -i 's/old/new/g'

它工作起来没有太多挫折感。它开箱即用。它就是工作。我正在寻找一个干净整洁的可行解决方案。你能帮助我吗?

答案1

找不到任何有关 的又长又丑的东西 find

find . -regex 'search_regex' -exec rename 's/old/new/g' {} +

答案2

rename如果这是您喜欢的语法,您可以进行递归:

shopt -s globstar
rename 's/old/new/' **/*

Bash 的globstar选项会**递归匹配 0 个或多个目录或文件,因此**/*会递归整个目录树。您只需将搜索模式写成 glob 而不是正则表达式即可。例如,要重命名名称包含 的所有文件foo,您可以执行以下操作:

shopt -s globstar
rename 's/old/new/' **/*foo*

答案3

您应该能够或多或少地保留使用 grep 和 sed 时相同的格式,但我认为您仍然需要像 find 这样的工具来为 grep 提供要搜索的文件。

编辑:根据评论中的信息进行了更新。感谢@pLumo 和@terdon 展示如果文件名称中含有换行符则会失败。

find /some/directory -print0 | grep -zE "search_regex" | rename -0 's/old/new/g'

相关内容