加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – find – grep花了太多时间

发布时间:2020-12-15 21:02:24 所属栏目:安全 来源:网络整理
导读:首先,我是一个使用bash脚本的新手,所以请原谅我,如果我犯了轻易的错误. 这是我的问题.我需要下载我公司的网站.我使用wget完成了这个没有问题,但是因为有些文件有?符号和窗口不喜欢文件名吗?我必须创建一个重命名文件的脚本,并更新调用重命名文件的所有文件
首先,我是一个使用bash脚本的新手,所以请原谅我,如果我犯了轻易的错误.

这是我的问题.我需要下载我公司的网站.我使用wget完成了这个没有问题,但是因为有些文件有?符号和窗口不喜欢文件名吗?我必须创建一个重命名文件的脚本,并更新调用重命名文件的所有文件的源代码.

为此,我使用以下代码:

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次(或更多次).

感谢所有的评论,我将尝试2 separete步骤,并且,同样,和FYI一样,有3291个文件是用wget下载的,仍然认为使用bash脚本比其他工具更喜欢这个?

解决方法

好的,这是想法(未经测试):

>在第一个循环中,只需移动文件并组成全局sed替换文件
>一旦完成,只需扫描所有文件并同时应用所有模式的sed,从而节省大量读/写操作,这可能是导致性能问题的原因
>我会避免将当前脚本放在当前目录中,否则它将由sed处理,所以我想所有要处理的文件都不在当前目录中但在数据目录中

码:

sedfile=/tmp/tmp.sed
data=data
rm -f $sedfile
# locate ourselves in the subdir to preserve the naming logic
cd $data

# rename the files and compose the big sedfile

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//?/-}"
 echo "s/$SUBSTRING/$NEWSTRING/g" >> $sedfile
done

# now apply the big sedfile once on all the files:    
# if you need to go recursive:
find . -type f  | xargs sed -i -f $sedfile
# if you don't:
sed -i -f $sedfile *

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读