我正在尝试重命名目录中文件名包含双引号的文件。
/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/