bash - 重命名文件但将它们保留在当前的子目录中

标签 bash awk mv renaming pwd

我有一个脚本,可以根据标签中的信息重命名 html 文件。该脚本遍历当前目录和所有子目录并递归执行此重命名。但是,在重命名它们之后,它将它们移动到我正在执行 shell 脚本的当前工作目录中。如何确保文件保留在其子目录中,并且不会移动到工作目录?

这是我正在处理的内容:

#!/usr/bin/env bash
for f in `find . -type f | grep \.htm`
   do
   title=$( awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' "$f" )
   mv  ./"$f" "${title//[ ]/-}".htm
done

最佳答案

切勿使用此构造:

for f in `find . -type f | grep \.htm`

因为循环对于包含空格的文件名失败,并且 grep 是不必要的,因为 find 有一个 -name 选项。改用这个:

find . -type f -name '*\.htm.*' -print |
while IFS= read -r f

这个:

awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF}

可以简化并澄清为:

awk 'BEGIN{IGNORECASE=1;FS="</?title>";RS=""}

请注意,EOF 的使用具有误导性,因为 EOF 只是一个 undefined variable ,因此包含一个空字符串(因此您的第一条记录将一直到第一个空行,而不是直到文件)。您可以使用 RS=bubba 并获得相同的效果,但将 RS 设置为空字符串会更清晰。并不是说这是您应该做的事情,而是您正在做的事情的更清晰的实现。

最后把它们全部重新组合在一起,这样的东西应该对你有用:

find . -type f -name '*\.htm.*' -print |
while IFS= read -r f
do
    title=$( awk 'BEGIN{IGNORECASE=1;FS="</?title>";RS=""} {print $2}' "$f"
    mv -- "$f" $(dirname "$f")/"${title//[ ]/-}".htm
done

关于bash - 重命名文件但将它们保留在当前的子目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20410402/

相关文章:

linux - 使用 Bash 备份目录

c++ - 将 C++ CGI 脚本作为后台进程运行?

regex - 与 5 个选项中的一个进行比较

awk - 更改文本文件的外观

bash - 无法让 ASCII 艺术回显到控制台

shell - 替换unix中相似的字符

bash - 在循环中重命名匹配模式的文件 - Bash

php - 如何将文件夹名称更改为ubuntu根目录

linux - 如何更改 child 目录中的文件名

bash - 如何使用awk将带有标题的新列添加到csv