🎶 Sym - 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台

📕 思源笔记 - 一款桌面端笔记应用,支持 Windows、Mac 和 Linux

🎸 Solo - B3log 分布式社区的博客端节点,欢迎加入下一代社区网络

♏ Vditor - 一款浏览器端的 Markdown 编辑器

Linux 中批量查找并替换

不使用 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
fi

echo "unzip......"
unzip -q /opt/deploy/oaweb.zip -d $staticPath

echo "replace css......"
echo "start to replace......" > $logPath
str="oaweb"
matchCounts=0

export GREP_OPTIONS=''--color=always''
for filePath in find /opt/nginx/html/$version/oaweb -name "*.css"
do

matchCount=`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 [选项]... 八进制模式 文件...
  或: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

功能强大的查找
用法: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

在文件或标准输入中使用正则查找
用法: 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        将标准输入的内容复制到标准输出。


欢迎注册黑客派社区,开启你的博客之旅。让学习和分享成为一种习惯!

推荐阅读
留下你的脚步