查找并重命名双引号包含目录中的文件

Find and rename double quotes contains files in directory

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

/tables/ddl/ directory

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

想删除包含它的文件名中的双引号。 像这样:

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

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

find . -name '*["]*'

我还尝试了中继目录和重命名文件。

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

是否可以同时查找重命名包含双引号的文件?

从第二个代码中 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' <<< "$file"命令去掉双引号 来自文件名。
  • 上面的命令假定目录名称(此处为tables/ddl) 不包括双引号。

或者简单地说:

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

双引号周围的单引号避免内部星号 * 用双引号括起来。