不使用 shell:
find style -name "*.css" -exec sed -i "s/0.1.1/0.1.2/g" {} \;
查找 style 目录下所有的 css 文件,把满足条件的文件中的 0.1.1 替换为 0.1.2.
这种理论上应该比下面的 shell 慢点吧,要打开所有的 css 文件(只是猜测)
使用场景:
运行脚本后,用户根据提示输入需要替换的内容后对指定目录下特定类型的文件进行全局替换
昨天没研究出上面那种就写了个 shell o(︶︿︶)o
回头看看,要理解命令的正直意思就简单了。下面这个 shell 是仿照网上弄的,一下搞不定就乱了阵脚,到处 google。。。
创建 sh:
#touch replace.sh
#chmod +x replace.sh
注意事项(半路出家者被坑的地方 T_T):
- if 后的中括号前后都需要空格
- sed 中如果使用了变量,需要使用双引号,否则在 shell 中变量不会被解析
代码:
嘿嘿,修改了下代码。
根据输入版本号,解压上传文件到以版本号为名的文件夹下。如果该文件夹已经存在,则查看是否被解压过(已解压过的则删除被解压好的文件),否则创建该文件夹。
打开匹配的文件,对其进行替换,并统计替换次数。
最后把替换的内容高亮输出到 log 中,reload nginx
#!/bin/bash echo -n "please input current version:" read version logPath="/opt/deploy/log/$version.log" staticPath="/opt/nginx/html/$version"if [ ! -d "staticPath" ] ; then mkdir staticPath
else
if [ -d "staticPath/oaweb" ] ; then rm -rf "staticPath/oaweb"
fi
fiecho "unzip......"
unzip -q /opt/deploy/oaweb.zip -d $staticPathecho "replace css......"
echo "start to replace......" > $logPath
str="oaweb"
matchCounts=0export GREP_OPTIONS=''--color=always''
for filePath infind /opt/nginx/html/$version/oaweb -name "*.css"
domatchCount=`grep -o "$str" $filePath | wc -l` matchCounts=`expr $matchCounts + $matchCount` if [ $matchCount -ne 0 ] ; then sed -i "s/$str/$version\/oaweb/g" $filePath echo $filePath >> $logPath cat $filePath | grep $str >> $logPath echo "" >> $logPath fi done
echo "matchCounts replaced......" >> logPath
echo "reload nginx......"
/opt/nginx/sbin/nginx -s reload
echo -n "view logPath?[y/n]" read isView if [ "isView" == 'y' ] ; then
cat $logPath
fi
命令解释:
touch居然被我用来创建文件了。用 vim 也可以
用法:touch [选项]... 文件...
将每个<文件>的访问及修改时间都更新为目前时间。
长选项必须用的参数在使用短选项时也是必须的。
-a 只更改访问时间
-c, --no-create 不创建任何文件
-d, --date=字符串 使用<字符串>表示的时间而不是目前的时间
-f (此选项不作处理)
-m 只更改修改时间
-r, --reference=FILE use this file's times instead of current time
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
--time=WORD change the specified time:
WORD is access, atime, or use: equivalent to -a
WORD is modify or mtime: equivalent to -m
--help 显示此帮助信息并退出
--version 输出版本信息并退出
用法:chmod [选项]... 模式[,模式]... 文件...
或:chmod [选项]... 八进制模式 文件...
或:chmod [选项]... --reference=参考文件 文件...
将每个[文件]的模式更改为[模式]。
-c, --changes 类似 --verbose,但只在有更改时才显示结果
--no-preserve-root do not treat `/' specially (the default)
--preserve-root fail to operate recursively on `/'
-f, --silent, --quiet 去除大部份的错误信息
-v, --verbose 处理任何文件都会显示信息
--reference=参考文件 使用[参考文件]的模式,而非自行指定权限模式
-R, --recursive 以递归方式更改所有的文件及子目录
--help 显示此帮助信息并退出
--version 输出版本信息并退出
echo
在显示器上显示一段文字,一般起到一个提示的作用
用法: echo [ -n ] 字符串
-n 表示输出文字后不换行;
功能强大的查找
用法:find path -option [ -print ] [ -exec -ok command ] {} \;
-print 将查找到的文件输出到标准输出
-exec command {} \; 将查到的文件执行command 操作,{} 和 \;之间有空格
-ok 和-exec相同,只不过在操作前要询用户
-name filename #查找名为filename的文件
read
从标准输入中读取一行。
用法:read [ -p ][ -r ][ -s ][ -u[ n ] ] [ VariableName?Prompt ]
-p 用 |& (管道,& 的记号名称)读取由 Korn shell 运行的进程的输出作为输入。
注:-p 标志的文件结束符引起该进程的清除,因此产生另外一个进程。
-r 指定读取命令把一个 \ (反斜杠) 处理为输入行的一部分,而不把它作为一个控制字符。
-s 把输入作为一个命令保存在 Korn shell 的历史记录文件中。
-u [ n ] 读取一位数的文件描述符号码 n 作为输入。文件描述符可以用 ksh exec 内置命令打开。n 的缺省值是 0,表示的是键盘。值 2 表示标准错误。
在文件或标准输入中使用正则查找
用法: grep [OPTION]... PATTERN [FILE] ...
-o, --only-matching show only the part of a line matching PATTERN
$?
上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值
sed没找到好的文章,自己搜吧
用法: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
-i[SUFFIX], --in-place[=SUFFIX]
替换保存,填写后缀后可以进行备份
-c, --copy
use copy instead of rename when shuffling files in -i mode
(avoids change of input file ownership)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
cat具体用法自己搜吧
用法:cat [选项] [文件]...
将[文件]或标准输入组合输出到标准输出。
-A, --show-all 等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号
-s, --squeeze-blank 不输出多行空行
-t 与 -vT 等价
-T, --show-tabs 将跳格字符显示为 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
--help 显示此帮助信息并退出
--version 输出版本信息并退出
如果[文件]缺省,或者[文件]为 - ,则读取标准输入。
示例:
cat f - g 先输出 f 的内容,然后输出标准输入的内容,最后输出 g 的内容。
cat 将标准输入的内容复制到标准输出。