gpt4 book ai didi

linux - 在 Bash 中使用基于 Perl 的重命名命令和查找

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:57 25 4
gpt4 key购买 nike

我今天在玩 Bash 脚本时偶然发现了 Perl。当我尝试删除多个文件名中的空格时,我发现 this帖子,对我帮助很大。

经过一番挣扎,我终于理解了重命名和替换命令及其语法。由于文件重复,我想尝试用“x”替换文件名末尾的所有“_(x)”。但是当我尝试自己做时,它似乎不起作用。我有以下代码的三个问题:

  • 为什么我运行它时什么也没执行?
  • 我使用重定向将成功说明显示为错误,所以我知道发生了什么。我做错了什么?
  • 经过大量研究,我仍然没有完全理解 Bash 中的文件描述符和重定向以及 Perl 中替代函数的语法。谁能给我一个好的教程的链接?
find -name "*_(*)." -type f | \
rename 's/)././g' && \
find -name "*_(*." -type f | \
rename 's/_(//g' 2>&1

最佳答案

您要么需要使用 xargs 或者你需要使用 find 执行命令的能力:

find -name "*_(*)." -type f | xargs rename 's/)././g'
find -name "*_(*." -type f | xargs rename 's/_(//g'

或者:

find -name "*_(*)." -type f -exec rename 's/)././g' {} +
find -name "*_(*." -type f -exec rename 's/_(//g' {} +

在这两种情况下,文件名都添加到 rename 的命令行中.事实上,rename必须读取它的标准输入才能发现文件名——但事实并非如此。

第一个find找到你想要的文件?是否需要模式末尾的点?正则表达式是否符合您的预期?好的,让我们也调试其中的一些。

您可以使用更复杂的正则表达式在一个命令中完成所有操作:

find . -name "*_(*)" -type f -exec rename 's/_\((\d+)\)$/$1/' {} +

find更正模式以丢失尾随 . 的要求.如果_(x)在扩展之前插入,那么你需要 "*_(*).*"作为 find 的模式(并且您需要修改 Perl 正则表达式)。

Perl 替代品需要剖析:

  • \(匹配左括号。
  • (启动捕获组。
  • \d+查找“一位或多位数字”。
  • )停止捕获组。它是第一个也是唯一的,所以它被赋予了数字 1。
  • \)匹配一个右括号。
  • $匹配文件名的结尾。
  • $1在替换中将捕获组 1 的值放入替换文本中。

在您的代码中,2>&1从第二个 rename 发送了错误消息命令到标准输出而不是标准错误。这在这里真的没有多大帮助。

您需要两个单独的教程;您不会找到涵盖 Bash 中的 I/O 重定向和 Perl 中的正则表达式的教程。

“官方”Perl 正则表达式教程是:

  • perlretut , 也可用 perldoc perlretut在你的机器上。

Bash 手册涵盖了 I/O 重定向,但它有点简洁:

关于linux - 在 Bash 中使用基于 Perl 的重命名命令和查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20164598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com