Shell 脚本攻略-命令行之乐
2018-03-19 本文已影响0人
羊陆之交
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[@]}