shell 学习笔记 常用命令 cat find xargs

摘自 Linux Shell 脚本攻略 第二章 命令之乐

cat

cat命令是一个经常会用到的简单命令,它本身表示conCATenate(拼接)

打印单个文件的内容

$ cat file.txt
This is a line inside file.txt
This is the second line inside file.txt

打印多个文件的内容

$ cat one.txt two.txt
This line is from one.txt
This line is from two.txt

从标准输入中读取 拼接数据

$ echo 'Text through stdin' | cat - file.txt
Text through stdin
This is a line inside file.txt
This is the second line inside file.txt

在上例中,-被作为stdin文本的文件名

去掉多余的空白行

$ cat -s multi_blanks.txt # 压缩相邻的空白行
line 1
line 2
line 3
line 4

将制表符显示为^I

$ cat file.py
def function():
	var = 5
		next = 6
	third = 7
$ cat -T file.py
def function():
^Ivar = 5
^I^Inext = 6
^Ithird = 7^I

行号

$ cat lines.txt
line
line
line
$ cat -n lines.txt
    1 line
	2 line 
	3 line

find

find是Unix/Linux命令行工具箱中最棒的工具之一。该命令在命令行和shell脚本编写方面都 能发挥功效。同cat和ls一样,find也包含大量特性,多数用户都没有发挥出它的最大威力。这 则攻略讨论了find的一些常用的查找功能

列出当前给定目录下所有文件和子目录

$ find 3d/ -print
3d/
3d/[CNUHD] LG 4K3D .mp4

print选项使用\n(换行符)分隔输出的每个文件或目录名。而-print0选项则使用空字符 '\0’来分隔。-print0的主要用法是将包含换行符或空白字符的文件名传给xargs命令

根据文件名或正则表达式进行搜索

$ find . -name '*.sh' -print
./coco.sh
./shift.sh
./debug.sh

在当前目录下 查找所有sh文件

$ find . \( -name '*.sh' -o -name '*.txt' \) -print
./coco.sh
./shift.sh
./docker_command.txt
./1.txt

也可以通过逻辑符添加 匹配逻辑 -a/-and 表示逻辑与 -o/-or表示逻辑或
在当前目录下 查找所有sh和txt文件

使用正则表达式

$ find . -regex '.+\.\(sh\|py\)$'
./for_fun/coco.py
./for_fun/main.py
./coco.sh
./shift.sh
./debug.sh

在当前目录下 查找所有sh或者py结尾的文件

否定参数 取反

$ find . ! -name '*.py'
./sum.txt
./3d
./3d/[CNUHD] LG 4K3D .mp4
./4k
./4k/[4K123]Hercules The Thracian Wars.mp4
./[4KVP9_29.97fps_10Mbps_8bit]UD_Europe_by_Dominic_0725.webm

在当前目录下 查找所有 非txt文件

基于目录深度的搜索

-maxdepth和–mindepth选项可以限制find命令遍历的目录深度。这可以避免find命令没
完没了地查找

$ find -L . -maxdepth 2 -name '*.py'
./for_fun/coco.py
./for_fun/main.py

-L选项告诉find命令跟随符号链接
从当前目录开始查找
-maxdepth 2将搜索范围仅限制在最深两级目录
-name 指定待查找的文件

根据文件类型搜索

find命令可以使用-type选项对文件搜索进行过滤。借助这个选项,我们可以告诉find命令只匹配指定类型的文件

  • 只列出所有的目录
$ find . -type d -print
  • 只列出普通文件
$ find . -type f -print
  • 只列出符号链接
$ find . -type l -print

类型-参数

根据时间戳进行搜索

  • 访问时间(-atime):用户最近一次访问文件的时间。
  1. 打印出在最近7天内被访问过的所有文件
$ find . -type f -atime -7 -print
  1. 打印出恰好在7天前被访问过的所有文件
$ find . -type f -atime 7 -print
  1. 打印出访问时间超过7天的所有文件
$ find . -type f -atime +7 -print
  • 修改时间(-mtime):文件内容最后一次被修改的时间。
  • 变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间
    -mtime选项会根据修改时间展开搜索,-ctime会根据变化时间展开搜索。

-atime、-mtime以及-ctime都是以“天”为单位来计时的。find命令还支持以“分钟”为计时单位的选项。这些选项包括

  • -amin(访问时间)
  • -mmin(修改时间)
  • -cmin(变化时间)
  1. 打印出7分钟之前访问的所有文件
$ find . -type f -amin +7 -print
  1. 按照指定文件时间对比 查找
$ find . -type f -newer file.txt -print

找出比file.txt修改时间更近的所有文件

基于文件大小的搜索

  • 大于2KB的文件
$ find . -type f -size +2k
  • 小于2KB的文件
$ find . -type f -size -2k
  • 大小等于2KB的文件
$ find . -type f -size 2k

除了k之外,还可以用其他文件大小单位 b:块(512字节) c:字节 w:字(2字节) k:千字节(1024字节) M:兆字节(1024K字节) G:吉字节(1024M字节)

基于文件权限和所有权的匹配

  • 列出具有特定权限的文件
$ find . -type f -perm 644 -print
  • 列出某用户拥有的所有文件
find . -type f -user slynux -print

利用find执行相应操作

  • 删除匹配的文件
$ ls *.log
kernel.log  logcat.log
$ find . -type f -name "*.log" -delete
$ ls *.log
ls: cannot access '*.log': No such file or directory
  • 执行命令
    利用-exec选项,find命令可以结合其他命令使用
$ ls -l *.sh
-rw-rw-r-- 1 amlogic amlogic 181 11月 15 19:45 coco.sh
-rw-rw-r-- 1 amlogic amlogic 120 11月  8 21:44 debug.sh
-rw-rw-r-- 1 amlogic amlogic  41 11月 15 16:49 shift.sh

$ find -maxdepth 1 -name '*.sh' -exec chmod a+x {} \;

$ ls -l *.sh
-rwxrwxr-x 1 amlogic amlogic 181 11月 15 19:45 coco.sh
-rwxrwxr-x 1 amlogic amlogic 120 11月  8 21:44 debug.sh
-rwxrwxr-x 1 amlogic amlogic  41 11月 15 16:49 shift.sh

在当前目录查找所有的sh文件 并添加执行权限
find命令使用一对花括号{}代表文件名
!注意该命令结尾的;。必须对分号进行转义,否则shell会将其视为find命 令的结束,而非chown命令的结束。

  • 下列命令可以将10天前的 .txt文件复制到OLD目录中
$ find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;

让find跳过特定的目录

  • 当前目录所有非.py 结尾文件
$ find ! -name '*.py'

$ find . 'for_fun/' -prune -o -type f  -print
amlogic@amlogic-ThinkCentre-M930t-N000:~/coco$ 

"for_fun/" –prune是命令中负责进行修剪的部分,它指明了for_fun目录应该被排除在外。 -type f –print描述了要执行的操作

xargs

xargs命令从stdin处读取一系列参数,然后使用这些参数来执行指定命令。它能将单行或 多行输入文本转换成其他格式,例如单行变多行或是多行变单行

在当前目录下的sh文件中搜索bin字符

$ ls *.sh | xargs grep bin
coco.sh:#!/bin/bash
coco.sh:/usr/bin/expect <<-EOF &>/dev/null
debug.sh:#!/bin/bash
shift.sh:#!/bin/bash

将多行输入转换成单行输出

$ cat example.txt 
1 2 3 4 5 6
7 8 9 10
11 12

$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12

将单行输入转换成多行输出

$ cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12

使用X分割并转换成2行输出

$ echo "splitXsplitXsplitXsplit" | xargs -d X -n 2
split split
split split

xargs 与find 结合

$ find . -maxdepth 1 -name '*.sh' -print |xargs grep -L coco
./coco.sh
./shift.sh
./debug.sh

当前目录下查找所有sh中不包含coco字符的文件

读取stdin,为命令传入格式化参数

cecho.sh

$ cat cecho.sh 
#!/bin/bash 
#文件名: cecho.sh
echo $*'#'

args.txt

$ cat args.txt 
arg1
arg2
arg3
  • 通过-n 限制传入命令参数的个数
$ cat args.txt | xargs -n 1 ./cecho.sh
arg1#
arg2#
arg3#
# 将参数个数设置为2
$ cat args.txt | xargs -n 2 ./cecho.sh
arg1 arg2#
arg3#
# 一次性提供所有的参数
$ cat args.txt | xargs ./cecho.sh
arg1 arg2 arg3#
  • 固定传参的格式
$ cat args.txt | xargs -I {} ./cecho.sh -p {} -l
-p arg1 -l#
-p arg2 -l#
-p arg3 -l#

-I {}指定了替换字符串。为该命令提供的各个参数会通过stdin读取并依次替换掉字符 串{}

组合使用示例

$ find . -type f -name "*.txt"  -print | xargs rm -f

删除当前目录下所有.txt文件

$ find . -type f -name "*.sh" -print |xargs -n 1 wc -l
12 ./coco.sh
4 ./shift.sh
11 ./debug.sh
3 ./cecho.sh

计算挡路目录下sh文件的行数

$ cat file.txt 
cecho.sh
coco.sh
debug.sh
shift.sh
$ cat file.txt | xargs -I {} cat {}
# 等同于 cat file.txt | ( while read arg; do cat $arg; done )

获取file.txt中所有文件的内容

$ cat coco.py 
coco is handsome

$ find . -name '*.py' |xargs -I ^ bash -c "echo -e 'coco\n ^';grep coco ^"
coco
 ./coco.py
coco is handsome

查找当前目录说有sh文件 并在文件名开头添加 coco\n 后输出 并在该文件中检索包含coco字符的行

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值