发现 - grep花了太多时间

时间:2016-10-06 17:23:29

标签: bash macos shell sed grep

首先,我是一个使用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

这有两个问题。

  1. 这花了太长时间,我已经等了5个多小时还在继续。
  2. 看起来在源代码中添加了一个附加内容,因为当我停止脚本并搜索更改时,URL会重复4次(或更多次)。
  3. 感谢大家的评论,我将尝试2个separete步骤,同时也看到,就像FYI一样,有3291个文件是用wget下载的,仍然认为使用bash脚本比其他工具更适合这个? / p>

3 个答案:

答案 0 :(得分:2)

看起来奇怪的是文件会有?在里面。网站网址有哪些?表示参数的传递。来自网站的wget也不能保证你获得网站,特别是如果服务器端执行,如php文件。因此,我怀疑wget是否具有递归性,它会查找url的传递参数,从而为您创建它们。

要真正获得该网站,您应该可以直接访问这些文件。

如果我是你,我会重新开始,不要使用wget。

您可能还遇到名称中包含空格的文件或目录的问题。

而不是使用xargs这一行,你一次只能做一个文件,而是递归地对所有文件进行grepping。只需在新文件上执行sed。

答案 1 :(得分:1)

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

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

代码:

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 *

答案 2 :(得分:0)

您可以使用grep命令或find命令列出文件,然后直接对其进行操作,而不是使用ls

例如,你可以这样做:

ls -1 /path/to/files/* | xargs sed -i '' "s/$SUBSTRING/$NEWSTRING/g"

在这里,我根据grep花了太长时间的另一个问题得出了这个想法:

Linux - How to find files changed in last 12 hours without find command