Shell 脚本攻略-命令行之乐

Cat

  • -n 会显示行号;-b 也会显示行号,但不计空格

find

  • 基本用法:find path -name "file_name.txt"

  • 忽略大小写:-iname

  • 搜索路径:-path, -regex

  • 否定参数:find . ! -name "*.txt",会查找除 txt 文件之外的所有文件

  • 限定目录递归深度:-maxdepth,-mindepth

  • 限定文件类型:-type,f 表示常规文件,d 表示目录

  • 根据时间搜索:

    command 说明
    -atime 访问时间,以天为单位
    -mtime 文件内容的修改时间
    -ctime 文件元数据的修改时间 (权限或所有者)

    -amin,-mmin,-cmin 含义类似,只是时间的单位为分钟

  • 限定文件大小:-size,常用的单位有 b, k, M, G

  • 对找到的文件执行命令:find . -name "*.txt" -exec printf "Text file: %s\n" {} \;{} 会被替换成搜索到的文件名称

xargs

Script

args.txt

arg1
arg2
arg3

test.sh

#!/bin/bash
echo $* '#'

Output

  • cat args.txt | xargs ./test.sh
    输出结果为:
    arg1 arg2 arg3 #

  • cat args.txt | xargs -n 2 ./my_sh.sh
    输出结果为:

arg1 arg2 #
arg3 #

Note

  • xargs 不带任何可选项时,会将 '\n' 替换为 ' ',合并为一行后作为后续命令的参数。
  • 可选项 -n 2 表示一行只有 2 个参数

tr

是转换 (translate) 的缩写。

  • 基本用法 echo "hello world" | tr [a-z] [A-Z],将小写字母转换为大写
  • -d 表示删除。echo "abc 123 12" | tr -d [0-9],将数字删除
  • -s 表示连续重复的字符只保留一个。echo "abc 1233 112" | tr -s " 1",将连续的空格和1只保留一个

sort

  • 默认以字典序排序
  • -n 以数字排序
  • -r 逆序排序
  • -k 以第几列排序,列之间通过空格区分
  • -z 排序结果以 \0 分隔,通过和 xargs -0 结合使用

uniq

  • 默认只保留一行连续的相等的行
  • -u 只显示唯一的行
  • -c 增加重复的统计计数
  • -d 只显示重复的行
  • -s num 忽略从首字符开始的字符数,-w 2 最大的比较的字符宽度

基于字符切分字符串

Script

#!/bin/bash
name=shell.cook.book
head1=${name%.*}
head2=${name%%.*}

echo head1: $head1
echo head2: $head2

name2=www.google.com
tail1=${name2#*.}
tail2=${name2##*.}

echo tail1: $tail1
echo tail2: $tail2

Output

head1: shell.cook
head2: shell
tail1: google.com
tail2: com

Note

  • 脚本中的 .* 是指匹配点以及后面的任意个字符,点可以换成其他需要被切分的字符
  • %# 是非贪婪匹配,%%## 是贪婪匹配

rename

  • rename *.JPG *.jpg
  • rename 's/ /_/g' *,替换文件名中的空格为下划线

并行运行多个命令

#!/bin/bash
pids=()
for file in file1.txt file2.txt
do
        md5 $file &
        pids+=("$!")
done

wait ${pids[@]}

你可能感兴趣的:(Shell 脚本攻略-命令行之乐)