- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1.使用find可以查找出符合某一特性(如权限、属主、长度、类型、名字等)的文件或目录,结合-exec、-ok和-xargs,可以完成更多的工作.
2.find的name选项:
根据文件名字匹配查找,如在自己的根目录下查找符合*.txt的文件:
扩展:find/!-name"myshell"-print 。
( 。
从上面的输出可以看出,对于root用户而言:
~ 。
$home 。
/root 。
代表的都是同一个目录,就是/root.
特别的,对于用户xxx而言,$home和~代表的就是/xxx目录,这个目录的位置(以zhy用户为例),如下:
可以看到,/zhy是在/home下。对于非管理员用户,/xxx目录都是在/home下,而root用户的/root目录位置如下:
是直接位于根目录下的(管理员是老大嘛,当然优待咯).
) 。
在当前目录下查找,就用“.“:
#find.-name"*.txt"-print 。
该命令会查找当前目录及子目录下满足条件的文件.
在当前目录中查找大写字母开头的文件:
#find.-name"[a-z]*"-print 。
注意后面有个* 。
在/etc中查找以"host"开头的文件:
#find/etc-name"host*"-print 。
在$home下查找所有文件:
#find~-name"*"-print 。
或 。
#find~-print 。
如果想让系统高负荷运转,就用从根目录查找:
#find/-name"*"-print(#find/-print) 。
对这个命令稍加修改:
#find/-name"*"-print& 。
就可以让它在后台运行了,这个时候,通过ctrl+c,也不能中断它的执行了。。.
查找文件以两个小写字母开头,跟着是两个数字的.txt文件,可以用:
#find/-name"[a-z][a-z][0-9][0-9].txt"-print 。
3.find的perm选项:
按照文件权限来查找文件.
查找文件属主可以读、写、执行,其他用户可以读、执行的文件:
#find.-perm755-print 。
如:
扩展:find.!-perm755-print 。
4.find的prune选项:
查找文件时,忽略某个目录,如:
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
#find/apps-name"/apps/bin"-prune-o-print 。
5.user和nouser选项:
user:根据文件的属主查找文件:
#find.-userzhy-print 。
在linux下,可能有些属主,可能被管理员删掉了,这个时候,就能用-nouser选项找到那些在属主在/etc/passwd文件中没有有效账户的文件。在用-nouser时,不用给出用户名.
#find/-nouser-print 。
6.使用group和nogroup:
就像使用user和nouser一样,group与nogroup选项能找出属于某一用户组的文件,和用户组已经不存在的文件.
#find/-groupzhy-print 。
#find/-nogroup-print 。
7.使用-mtime选项:
该选项可以查找指定时间内或指定时间外修改的文件,如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件:
-1表示1日(24小时)之内更改过的文件.
+2表示2日(48小时)之前更改过的文件.
8.newer选项:
newer命令能让我们找出更改时间介于两个文件之间的文件,如有下面两个文件,它们更改时间相差大概两天:
通过下面的命令,我们就可以找出更改时间介于这两者的文件了:
#find/-newerage.awk!-newerbelts.awk-execls-l{}\,
从上面可以看出,这种比较必须有参考的文件,比如要查找更改时间在两个小时以内的文件,就必须有一个更改时间正好在两个小时之前那个时刻的文件可以供参考。这里我们可以通过touch来创建一个指定更改时间的文件:
假如现在是12月26日10点41分,那就需要创建一个更改时间在12月26日08点41分的文件:
#touch-t12260841oldfile 。
然后通过:
#find/-neweroldfile-print 。
来查找更改时间在两个小时内的文件.
9.用type查找指定类型的文件:
在根目录下,查找所有的目录:
#find/-typed-print 。
查找除目录以外所有类型的文件:
#find/!-typed-print 。
查找所有符号链接文件:
#find/-typel-print 。
查找所有普通文件:
#find/-typef-print 。
10.使用size选项:
使用可以查找指定长度的文件,可以以字节为单位,也可以用块为单位,1块=512字节(0.5m).
以字节为单位,需要在数字后面加c,如:
在根目录下查找文件长度大于1m的文件:
#find/-size+1000000c-print 。
用块表示就是
#find/-size+2-print 。
查找刚好是100字节的文件:
#find/-size100c-print 。
查找小于100字节的文件:
#find/-size-100c-print 。
11.使用depth选项:
查找时使用depth命令,可以先在指定文件的根目录下查找所有文件,再进入子目录中查找,有时备份可能需要这样做.
如:从根目录开始,查找名为"con.file"的文件,它将首先匹配所有的文件然后再进入子目录查找:
#find/-name"con.file"-depth-print 。
12.使用mount选项:
查找文件时,可以只在指定目下查找,而不进入子目录下查找,这可以通过mount指定.
如:
#find.-name"*.xc"-mount-print 。
13.使用cpio选项:
cpio选项可以用来向磁带设备备份文件或从中恢复文件。结合find,可以在整个文件系统中查找文件,然后用cpio命令将其备份到磁带上.
下面的命令:
#cd/ 。
#findetchomeapps-depth-print|cpio-ivcdc65535-o\ 。
/dev/rmt0 。
\用来告诉系统,shell命令还没有结束,请忽略\后面的回车。该命令用来将/etc、/home和/apps目录下的文件备份到设备/dev/rmt0中.
上面命令中etc、home、apps前都没有/,这是用了相对路径(用了/就是绝对路径),之所以用相对路径,是因为:
在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/etc,那么在恢复时,就只能恢复到/etc目录中去,别无其他选择.
上面的命令,告诉find命令首先进入/etc目录,然后是/home和/apps目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份.
顺便说一下,在上面的例子中cpio命令使用了c65536选项,我本可以使用b选项,不过这样每块的大小只有512字节,而使用了c65536选项后,块的大小变成了64k字节(65536/1024).
14.使用exec或ok选项:
用find匹配到一些文件之后,可以用exec和ok选项来对其进行某些操作.
用exec和ok的格式是:exec(ok)选项后面跟随着所要执行的命令,然后是一对儿{},一个空格和一个\,最后是一个分号.
如:
#find.-typef-execls-l{}\,
该命令查找并列出匹配到的文件.
#findlogs-typef-mtime+5-execrm{}\,
该命令查找更改时间在5天以前的普通文件,并删除它们.
exec的安全模式:ok 。
#find.-name"*.log"-mtime+5-okrm{}\,
该命令和用exec的唯一区别就是该命令在删除时,会给出提示.
#find/etc-name"passwd*"-execgrep"zhy"{}\,
该命令首先匹配所有名为"passwd*"的文件,如:passwd、pssswd.old、passwd.bak,然后执行grep命令查看在这些命令中是否存在zhy用户.
find的其他例子:
#find~-print(find$home-print) 。
查找所有文件 。
#find.-typef-perm4755-print 。
查找suid置位,文件属主具有读、写、执行权限,其他用户具有读和执行权限的文件.
#find/-groupzhy-print 。
查找属主是zhy的文件.
#$find/logs-name'admin.log[0-9][0-9][0-9]'-mtime+7-execrm{}\,
查找具有指定名称的,修改日期在7天以前的文件,并删除.
#find/dev/rmt-print 。
查找系统中所有的rmt磁带设备.
15.使用xargs选项:
为什么使用xargs:
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定.
例:
#find/-typef-print|xargsfile|tee/root/shell/xargs.log 。
查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件,并将输出导入到xargs.log文件中。用-exec试下,就是:
#find/-typef-print-execfile{}\;|tee/root/shell/exec.log 。
通过对比xargs.log和exec.log,发现二者的输出,确实一样,但执行xargs命令的效率明显比-exec快很多(从执行速度上看).
#find/apps/audit-perm777-print|xargschmodo-w 。
在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回其他用户的写权限.
#find/-typef-print|xargsgrep"device" 。
用grep命令在所有的普通文件中搜索device这个词:
#find.-name\*-typef-print|xargsgrep"192.168.5.29" 。
该命令在当前目录下的所有普通文件中搜索192.168.5.29这个词,\用来取消find命令中的*在shell中的特殊含义.
最后此篇关于Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs的文章就讲到这里了,如果你想了解更多关于Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!