【发布时间】:2017-02-15 13:30:14
【问题描述】:
首先,我是 bash 脚本的新手,如果我犯了简单的错误,请原谅我。
这是我的问题。我需要下载我公司的网站。我使用wget 完成此操作没有任何问题,但是因为某些文件具有? 符号并且windows 不喜欢? 的文件名,我必须创建一个脚本来重命名文件并更新所有文件的源代码调用重命名文件。
为此,我使用以下代码:
find . -type f -name '*\?*' | while read -r file ; do
SUBSTRING=$(echo $file | rev | cut -d/ -f1 | rev)
NEWSTRING=$(echo $SUBSTRING | sed 's/?/-/g')
mv "$file" "${file//\?/-}"
grep -rl "$SUBSTRING" * | xargs sed -i '' "s/$SUBSTRING/$NEWSTRING/g"
done
这有两个问题。
- 这花费的时间太长了,我已经等了 5 个多小时了,而且还在继续。
- 看起来像是在源代码中进行附加,因为当我停止脚本并搜索更改时,URL 会重复 4 次(或更多)。
感谢大家的 cmets,我将尝试 2 个单独的步骤,并且,正如仅供参考,使用 wget 下载了 3291 个文件,仍然认为使用 bash 脚本比其他工具更受欢迎?
【问题讨论】:
-
你确定它真的在运行,而不仅仅是在等待输入吗?
-
请注意,'?'您的某些 URL 中的字符会引入查询字符串。这表明底层资源可能是动态的,并且可能在不同的时间返回不同的内容。
-
您可以通过首先回显从 find 命令找到的文件然后添加其他操作来进行增量调试。
-
对于每个文件,您执行一个
grep -rl "$SUBSTRING" * | xargs sed -i '' "s/$SUBSTRING/$NEWSTRING/g",该grep -rl "$SUBSTRING" * | xargs sed -i '' "s/$SUBSTRING/$NEWSTRING/g"处理您运行它的目录中的所有文件,这需要很长时间并且没有用。 -
rev显然是一种非常浪费的方式来处理${line##*/}。如果您非常想浪费外部进程,也可以使用basename命令,但如果这里的任务是优化脚本,使用本机 Bash 似乎是可行的方法。