Linux命令(三)find,xargs

本文介绍了Linux中的find和xargs命令的使用方法。find命令用于按文件结构遍历搜索,支持多种条件查找,如按文件类型、修改时间、权限等。同时,结合-exec选项可以执行指定操作,如删除、移动文件。xargs命令则解决了find命令在处理大量文件时可能出现的参数列溢出问题,通过将查找结果传递给其他命令,实现更高效的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇记录2个命令,分别是:find,xargs

1.find

作用: 按文件结构遍历搜素,找到符合条件的文件并按照相应的操作来展现
格式:

find option [expression]

默认路径是在当前目录,打印信息用-print
expression包含几个因素:操作,操作数,测试表达式,动作

parameterfunction
-name按名称寻找文件
-exec找到文件后再执行exec命令后面的操作
-type按类型查找文件
-print输出找到的文件的信息
-user按所有者(文件的主人)来查找文件
-mtime -n +n根据修改时间找到文件

1.1按普通的条件查找

使用例子:
1.打印当前路径下的文件的信息,只打印前十条

find . -print |head -10

2.打印当前路径下以.txt结尾的文件的信息

find . -name "*.txt" -print |head -10 

这里不用type,因为type是关于帮助文件,可执行文件之类的定义的,跟pdf,txt这种文件类型不一样,在详细信息中可以找到
3.打印当前路径下以.txt结尾或者以.pdf的文件的信息

find . \ (-name "*.txt" -or  -name "*.pdf"  \)

4.打印当前路径下除了以.txt结尾的文件的信息

find . ! -name "*.txt" -print |head -10 

-print可以不要,结果一样的
在这里插入图片描述
5.按文件类型查找文件

find -type f -name "*.txt" 

查找普通文件
补充知识: 关于文件的类型如下:

parameterfunction
-f普通文件
-lsymbolic link file符号链接文件
-ddirectory 目录

6.按修改时间查找文件,超找48小时内修改过的文件

find -atime -2

7.按照目录和文件权限来查找文件,查找/home/ling目录下 权限为 777的文件

find /home/ling -perm 777

8.打印当前目录下所有以txt结尾的符号链接文件

find . -type l -name "*.txt"

8.打印当前目录下所有以php结尾的,权限是777的普通文件

find . -type f -name "*.php" -perm 777

9.打印当前目录下所有root持有的文件

find . -type f -user  root

10.打印当前目录下所有权限不是777也不是644的普通文件

find . -type f \(!-perm 777 -and !-perm 644\)

注意777不可写成"777"
(待完成:准备文件时,修改权限无效的解决办法)

1.2 查找后执行命令 -exec

1.ls -l命令放在find命令的-exec选项中

find . -exec ls -l {}\;

2.在目录中查找更改时间在2日以前的文件并删除它们

find .  -type f-mtime +2 -exec rm {}\;

**备注:**2天以内的用-2
3.在目录中查找更改时间在2日以前的文件并删除它们,在删除之前先给出提示

find . -etime -2 -ok -i {}\;

-ok是-exec的安全模式,每次执行前都会提示
4.-exec中使用grep命令,先匹配所有文件名为“ passwd*”的文件,例如passwd、
passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户

find . -name "passwd*" -exec grep "root" {}\;

5.查找文件移动到指定目录home/ling

find .  -exec mv {} home/ling\;

6.用exec选项执行cp命令

find .   -name "*.log" -exec cp {} home/ling \;

7.将所有.c文件中的代码合并到all.c

find .  -name "*.c" -exec cat {} \;> all.c\;

注意指令和其他符号之间要有间隔,比如cat 和{}之间,不然就会被识别成一串的
8.当命令行较多时可以将exec脚本放入文件,然后执行文件。请写出找到当前所有的.c文件后,打印第一个文件,并将它合并到all.c,打印并合并的操作放到当前目录下command.sh的文件里的操作

find .  -name "*.c"-exec |commmand.sh\;

command.sh的内容:

#! /bin/sh
ls -l $1
cat $1

第一行是sh文件开头必须写的,用来告诉系统需要什么程序执行
$1代表第一行

2.xargs

作用: 在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
格式:

xargs [option]
parameterfunction
n一行最多打印几个字
d寻找分割符,相当于java String 类里的split()

使用例子:
1.将a.tx里的好几行内容变成一行
文件a.txt里的内容:
1 2 3
4 5 6 7
8 9

cat a.txt | xargs

结果:
在这里插入图片描述

2.将一行变成n行
在这里插入图片描述
3.用i分割开字符串并按每行最多3个打印
在这里插入图片描述
4.查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

find . -type f -print | xargs file

5.在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限

find . -perm -7 -print | xargs chmod o-w

使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]
6.用grep命令在所有的普通文件中搜索hostname这个词

find . -name \* -type f -print | xargs grep "hostnames"

\是表示转义,用来取消find命令中的*在shell中的特殊含义
7.使用xargs执行mv

find . -name "*.log" | xargs -i mv {} test4

使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如下面例子中的[]

 find . -name "file" | xargs -I [] cp [] ..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值