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

标签 shell rename

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

/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) 作为分隔符 文件以保护文件中的空白字符(空格、制表符等) 文件名(如果有)。
  • -d ""选项 read命令对应于-print0多于 将空字符上的输入流再次拆分为文件名。
  • sed 's/"//g' <<< "$file"命令删除双引号 从文件名。
  • 上面的命令假定目录名称(此处为tables/ddl) 不包含双引号。

或者简单地说:

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

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

关于shell - 查找并重命名双引号包含目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70661098/

相关文章:

linux - "cannot execute binary file"尝试在 linux 上运行 shell 脚本时

bash - 在命令替换中使用外部调用的陷阱会破坏父 Bash shell

android - 当/system/bin/sh 丢失时,如何在 android 上获得一个可用的 adb shell?

bash - 如何将 SHELL 重新更改为默认 bash 而不是 zsh

file - 如何重命名文件对象方法

Bash 循环行为异常

python - 如何使用 python 列表有效地重命名数据帧索引?

bash - 更新文件名中的数字

python - 如何将函数的参数作为后缀添加到该函数内的每个变量?

Eclipse 重命名/重构覆盖