【问题标题】:Find and rename double quotes contains files in directory查找并重命名双引号包含目录中的文件
【发布时间】:2022-01-11 02:52:39
【问题描述】:

我正在尝试重命名的文件在目录中包含带有文件名的双引号。

/tables/ddl/ 目录

"user".sql
"customer".sql
inventory.sql
"orders".sql

希望删除包含该文件名的双引号。 像这样:

user.sql
customer.sql
inventory .sql
orders.sql

在我的 shell 脚本中,为了查找带双引号的文件,我使用了带有正则的 find 命令,如下所示。它显示带有双引号的文件列表。

find . -name '*["]*'

我也尝试过中继目录和重命名文件。

for myfile in /tables/ddl/*; do
    echo $myfile
    rename 's,^[0-9]{2}\.,,' *sql
done

是否可以同时findrename文件包含双引号?

【问题讨论】:

  • 首先,让我澄清一下你真正想要做什么。是否要通过删除两个前导数字和以下点 if 文件名包含双引号来重命名文件?我看到 /tables/ddl/ 中的一些文件包含双引号,但它们都没有前导数字。您能否更新您的问题,包括与第二次操作匹配的文件名以及预期结果?
  • 感谢@tshiono 忘记添加所需的结果。补充说
  • 感谢您的及时反馈。顺便说一句,rename 's,^[0-9]{2}\.,,' *sql 命令呢?您只是举例说明rename 命令的用法吗?
  • 是的。在另一个问题中找到了用于重命名带有特殊字符的文本的正则表达式命令。用于解释问题。

标签: shell rename


【解决方案1】:

从第二个代码中rename 命令的用法来看,您似乎可以使用基于perl 的rename 命令。 (有两种不同的重命名命令,一种是基于 perl 的,另一种不是。令人困惑。)
然后你可以重命名删除双引号的文件:

rename 's/"//g' /tables/ddl/*.sql
  • 第一个参数s/"//g 是删除双引号的perl 语句。
  • 您可以使用 type-glob *.sql 一次将多个文件传递给 rename 命令。
  • 上面的命令不会影响不包含双引号的文件。

[编辑]
这是一个没有基于 perl 的 rename 命令的替代方法:

find tables/ddl -type f -name '*"*' -print0 | while IFS= read -r -d '' file; do
    mv -- "$file" "$(sed 's/"//g' <<< "$file")"
done
  • find 命令的用法和你的差不多。
  • -print0 选项指定一个空字符 (\0) 作为分隔符 文件中保护空白字符(空格、制表符等) 文件名,如果有的话。
  • read 命令的-d "" 选项对应于上面的-print0 将空字符上的输入流再次拆分为文件名。
  • sed 's/"//g' &lt;&lt;&lt; "$file" 命令删除双引号 来自文件名。
  • 上面的命令假定目录名(tables/ddl 这里) 不包括双引号。

或者简单地说:

for file in tables/ddl/'"'*'"'.sql; do
    mv -- "$file" "$(sed 's/"//g' <<< "$file")"
done

双引号周围的单引号避免内部星号*被双引号包裹。

【讨论】:

  • 您能否解释一下您在解决方案中提到的另一种方式(不使用基于 perl 的命令)。它也会有所帮助:)
  • 当然。我已经更新了我的答案,添加了一个没有基于 perl 的 rename 命令的替代方案。希望对您有所帮助。
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2016-01-07
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多