首先,我是一个使用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
这有两个问题。
感谢大家的评论,我将尝试2个separete步骤,同时也看到,就像FYI一样,有3291个文件是用wget下载的,仍然认为使用bash脚本比其他工具更适合这个? / p>
答案 0 :(得分:2)
看起来奇怪的是文件会有?在里面。网站网址有哪些?表示参数的传递。来自网站的wget也不能保证你获得网站,特别是如果服务器端执行,如php文件。因此,我怀疑wget是否具有递归性,它会查找url的传递参数,从而为您创建它们。
要真正获得该网站,您应该可以直接访问这些文件。
如果我是你,我会重新开始,不要使用wget。
您可能还遇到名称中包含空格的文件或目录的问题。
而不是使用xargs这一行,你一次只能做一个文件,而是递归地对所有文件进行grepping。只需在新文件上执行sed。
答案 1 :(得分:1)
好的,这是想法(未经测试):
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