感谢支持ayqy个人订阅号,每周义务推送1篇(only unique one)原创精品博文,话题包括但不限于前端、Node、Android、数学(WebGL)、语文(课外书读后感)、英语(文档翻译) 如果觉得弱水三千,一瓢太少,可以去 http://blog.ayqy.net 看个痛快
cat(concatenate)
读取、显示、拼接文件内容
把来自标准输入的内容和文件内容拼接起来:
代码语言:javascript复制echo 'from stdin' | cat - test.sh
cat
命令用-
表示标准输入
If file is a single dash (`-‘) or absent, cat reads from the standard input.
其它常用功能选项:
代码语言:javascript复制# 给文件内容添上行号
cat -n test.sh
# 把文件中的连续多个空行压缩成一个
cat -s test.sh
find
基本规则
从文件目录向下遍历,匹配符合条件的,处理
代码语言:javascript复制# 列出当前目录下所有文件/文件夹、子文件/文件夹
find .
# 用 分隔(文件路径里有换行符时有用)
find . -print0# 通配符
find -name "*.js"
# 忽略大小写
find -iname "*.js"
# 多条件
find . ( -name "e*" -o -name "s*" )
# 路径匹配
find ../tnode -path "*node*"
# 与-path一样,只是参数为正则表达式
find . -regex ".*/e.*h$"
# 忽略大小写
find . -iregex ".*/e.*h$"# 否定参数(独立参数,可以配合-name/path/regex等用)
find . ! -iregex ".*/e.*h$"
# 例如排除路径含有node_modules的
find ../tnode ! -regex ".*node_modules.*"# 指定目录深度,-maxdepth 1表示向下找1级(也就是..的孩子,不找孙子)
find .. -name "*.js" -maxdepth 1
# 也可以指定起始深度,-mindepth 2 -maxdepth 2表示只在..的孙子中找,不找儿子也不找孙子的儿子
find .. -name "*.js" -mindepth 2 -maxdepth 2
# 单独用-mindepth找超过指定深度的文件(找深路径lib)
find .. -regex ".*node_modules*.*.js$" -mindepth 20
按文件类型搜索
代码语言:javascript复制# 指定文件/文件夹,-type f表示只输出文件
find ../tnode ! -regex ".*node_modules.*" -type f
P.S.参数顺序会影响搜索效率,比如先检查深度再过滤类型更快
文件类型与type
参数值对应关系:
普通文件:f
符号链:l
目录:d
面向字符的设备文件:c
面向块的设备文件:b
套接字:s
FIFO:p
按时间搜索
每个文件有3种时间戳:
代码语言:javascript复制访问时间:-atime
修改时间:-mtime
变化时间:-ctime
参数值为整数,表示天数,可以前缀
和-
,分别表示大于,小于,例如:
# 找出父级目录中,昨天到现在访问过的文件
find .. -type f -atime -1
也有以分钟为单位的:
代码语言:javascript复制# -amin, -mmin, -cmin
find .. -type f -amin $((-1 * 60 * 24))
还可以指定一个文件作为参照,找出更新的(修改时间更近的)文件:
代码语言:javascript复制# 找出父级目录中,比~/.bash_profile更新的文件
find .. -type f -newer ~/.bash_profile
按文件大小搜索
代码语言:javascript复制# 当前目录下大于1K的文件
find . -type f -size 1k
支持b块, c字节, w字, k, M, G
单位,注意前面小写,后两个大写,在其它命令里一般也是这样,例如split
其它用法
代码语言:javascript复制# 查找并删除
find . -type f -name "*.tmp" -delete
# 匹配文件权限
find . -type f -perm 777 -print
find . -type f -user ayqy
与-exec
结合执行其它命令
# 查找并格式化输出
find . -type f -exec printf "file: %sn" {} ;
# 查找并备份
find . -type f -mtime 7 -exec cp {} bak/ ;
P.S.末尾转义分号用来表示-exec
参数值结束,必须要有
-exec
只能执行一条命令,需要执行多条的话,把命令写入文件再执行,例如把备份命令写入bak.sh
:
#!/bin/bash
BAK_DIR=bakif ! test -e "$BAK_DIR";
then
mkdir "$BAK_DIR"
fifor file in "$@";
do
cp $file "$BAK_DIR"
done
再查找执行:
代码语言:javascript复制find . -type f -mtime 7 -exec ./bak.sh {} ;
-prune
排除不需要查找的东西:
# 跳过.git和node_moudles目录
find . ( -name ".git" -prune ) -o ( -name "node_modules" -prune ) -o ( -type f -print )
xargs
xargs
命令把从stdin
接到的数据重新格式化,作为参数提供给其它命令,紧跟在管道操作符之后,基本形式:
cmd | xargs
把多行输入转换成单行输出:
代码语言:javascript复制# 把换行符换成空格
cat test.sh | xargs
把单行输入转换成多行输出:
代码语言:javascript复制# 按每行参数数量断开
echo "1 22 3 4 5 6 7" | xargs -n 3
-d
指定分隔符,实现字符串split
:
# split
echo "1,2,3,4" | xargs -d ,
# `-d`参数是GUN扩展,FreeBSD和mac上没有,用其它方法完成
echo "1,2,3,4" | tr , ' '
-I
指定替换字符串:
# replace
echo "1 2 3 4" | xargs -n 1 -I {} find {}.txt
find
结合xargs
:
# 查找并删除
find . -type f -name "*.tmp" -print0 | xargs -0 rm -f
这里的-print0
和xargs -0
用