linux find for(linux最好用的系统)
大家好,今天小编来为大家解答以下的问题,关于linux find for,linux最好用的系统这个很多人还不知道,现在让我们一起来看看吧!
Linux命令之find的高级用法
在Linux系统中,find命令作为强大工具,能依据多种条件精确查找文件和目录,其实力远超基本操作。以下是find命令的高级运用实例:
1.删除超时且空的文件夹:在当前目录下,使用`find-type d-empty-ctime+6-exec rm{}\;`,可查找并移除超过6天且为空的文件夹。
2.查找特定大小的文件:在根目录下,`find-type f-size+1000M`,能定位大于1GB的文件。
3.查找特定权限的文件:在当前目录,`find-type f-perm 777`,输出777权限的文件。
4.排除目录搜索:`find.-type f!-path"./keys"-prune`,排除keys目录内的文件搜索。
5.排除多个目录:`find.-type f-path"./conf"-o-path"./logs"-prune`,同时排除conf和logs。
6.正则表达式搜索与修改:`find-type f-name"*.txt"-exec rename{}.csv\;`,修改.txt结尾文件为.csv。
7.正则表达式匹配:find-regex'.sh$'-exec sed's#(.*.)sh$#mv&\1shell#'{}\;,处理.sh文件名。
8.查找并删除旧文件:`find.-ctime+7-exec rm{}\;`,7天前的文件将被移除。
9.解决find+xargs错误:`find.-print0| xargs-0 your_command`,避免处理长文件名时的错误。
10.排除特定文件:`find/data2/logs/fanbook/log_center!-name"rep*"`,排除以"rep"开头的文件。
通过这些高级用法,find命令在Linux中能够更灵活地管理文件,提升工作效率。
Linuxfind命令实例教程15个find命令用法
除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行之旅更加简易。
本文将介绍15种无论是于新手还是老鸟都非常有用的Linux find命令。
首先,在你的home目录下面创建下面的空文件,来测试下面的find命令示例。
复制代码代码如下:
# vim create_sample_files.sh
touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c
mkdir backup
cd backup
touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c
# chmod+x create_sample_files.sh
#./create_sample_files.sh
# ls-R
.:
backup MybashProgram.sh MyCProgram.c
create_sample_files.sh mycprogram.c Program.c
./backup:
MybashProgram.sh mycprogram.c MyCProgram.c Program.c
1.用文件名查找文件
这是find命令的一个基本用法。下面的例子展示了用MyCProgram.c作为查找名在当前目录及其子目录中查找文件的方法。
复制代码代码如下:
# find-name"MyCProgram.c"
./backup/MyCProgram.c
./MyCProgram.c
2.用文件名查找文件,忽略大小写
这是find命令的一个基本用法。下面的例子展示了用MyCProgram.c作为查找名在当前目录及其子目录中查找文件的方法,忽略了大小写。
复制代码代码如下:
# find-iname"MyCProgram.c"
./mycprogram.c
./backup/mycprogram.c
./backup/MyCProgram.c
./MyCProgram.c
3.使用mindepth和maxdepth限定搜索指定目录的深度
在root目录及其子目录下查找passwd文件。
复制代码代码如下:
# find/-name passwd
./usr/share/doc/nss_ldap-253/pam.d/passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
在root目录及其1层深的子目录中查找passwd.(例如root— level 1, and one sub-directory— level 2)
复制代码代码如下:
# find-maxdepth 2-name passwd
./etc/passwd
在root目录下及其最大两层深度的子目录中查找passwd文件.(例如 root— level 1, and two sub-directories— level 2 and 3)
复制代码代码如下:
# find/-maxdepth 3-name passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
在第二层子目录和第四层子目录之间查找passwd文件。
复制代码代码如下:
# find-mindepth 3-maxdepth 5-name passwd
./usr/bin/passwd
./etc/pam.d/passwd
4.在find命令查找到的文件上执行命令
下面的例子展示了find命令来计算所有不区分大小写的文件名为“MyCProgram.c”的文件的MD5验证和。{}将会被当前文件名取代。
复制代码代码如下:
find-iname"MyCProgram.c"-exec md5sum{} \;
d41d8cd98f00b204e9800998ecf8427e./mycprogram.c
d41d8cd98f00b204e9800998ecf8427e./backup/mycprogram.c
d41d8cd98f00b204e9800998ecf8427e./backup/MyCProgram.c
d41d8cd98f00b204e9800998ecf8427e./MyCProgram.c
5.相反匹配
显示所有的名字不是MyCProgram.c的文件或者目录。由于maxdepth是1,所以只会显示当前目录下的文件和目录。
复制代码代码如下:
find-maxdepth 1-not-iname"MyCProgram.c"
.
./MybashProgram.sh
./create_sample_files.sh
./backup
./Program.c
6.使用inode编号查找文件
任何一个文件都有一个独一无二的inode编号,借此我们可以区分文件。创建两个名字相似的文件,例如一个有空格结尾,一个没有。
复制代码代码如下:
touch"test-file-name"
# touch"test-file-name"
[Note: There is a space at the end]
# ls-1 test*
test-file-name
test-file-name
从ls的输出不能区分哪个文件有空格结尾。使用选项-i,可以看到文件的inode编号,借此可以区分这两个文件。
复制代码代码如下:
ls-i1 test*
16187429 test-file-name
16187430 test-file-name
可以如下面所示在find命令中指定inode编号。在此,find命令用inode编号重命名了一个文件。
复制代码代码如下:
find-inum 16187430-exec mv{} new-test-file-name \;
# ls-i1*test*
16187430 new-test-file-name
16187429 test-file-name
可以在你想对那些像上面一样的糟糕命名的文件做某些操作时使用这一技术。
例如,名为file?.txt的文件名字中有一个特殊字符。
若你想执行“rm file?.txt”,下面所示的所有三个文件都会被删除。
所以,采用下面的步骤来删除”file?.txt”文件。
复制代码代码如下:
ls
file1.txt file2.txt file?.txt
找到每一个文件的inode编号。
复制代码代码如下:
ls-i1
804178 file1.txt
804179 file2.txt
804180 file?.txt
如下所示:?使用inode编号来删除那些具有特殊符号的文件名。
复制代码代码如下:
find-inum 804180-exec rm{} \;
# ls
file1.txt file2.txt
[Note: The file with name"file?.txt" is now removed]
7.根据文件权限查找文件
下面的操作时合理的:
找到具有指定权限的文件
忽略其他权限位,检查是否和指定权限匹配
根据给定的八进制/符号表达的权限搜索
此例中,假设目录包含以下文件。注意这些文件的权限不同。
复制代码代码如下:
ls-l
total 0
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
---------- 1 root root 0 2009-02-19 20:31 no_for_all
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
找到具有组读权限的文件。使用下面的命令来找到当前目录下对同组用户具有读权限的文件,忽略该文件的其他权限。
复制代码代码如下:
find.-perm-g=r-type f-exec ls-l{} \;
-rw-r--r-- 1 root root 0 2009-02-19 20:30./everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31./all_for_all
----r----- 1 root root 0 2009-02-19 20:27./others_can_only_read
-rw-r----- 1 root root 0 2009-02-19 20:27./others_can_also_read
找到对组用户具有只读权限的文件。
复制代码代码如下:
find.-perm g=r-type f-exec ls-l{} \;
----r----- 1 root root 0 2009-02-19 20:27./others_can_only_read
找到对组用户具有只读权限的文件(使用八进制权限形式)。
复制代码代码如下:
find.-perm 040-type f-exec ls-l{} \;
----r----- 1 root root 0 2009-02-19 20:27./others_can_only_read
8.找到home目录及子目录下所有的空文件(0字节文件)
下面命令的输出文件绝大多数都是锁定文件盒其他程序创建的place hoders
find~-empty
只列出你home目录里的空文件。
find.-maxdepth 1-empty
只列出当年目录下的非隐藏空文件。
find.-maxdepth 1-empty-not-name".*"
9.查找5个最大的文件
下面的命令列出当前目录及子目录下的5个最大的文件。这会需要一点时间,取决于命令需要处理的文件数量。
复制代码代码如下:
find.-type f-exec ls-s{} \;| sort-n-r| head-5
10.查找5个最小的文件
方法同查找5个最大的文件类似,区别只是sort的顺序是降序。
复制代码代码如下:
find.-type f-exec ls-s{} \;| sort-n| head-5
上面的命令中,很可能你看到的只是空文件(0字节文件)。如此,你可以使用下面的命令列出最小的文件,而不是0字节文件。
复制代码代码如下:
find.-not-empty-type f-exec ls-s{} \;| sort-n| head-5
11.使用-type查找指定文件类型的文件
只查找socket文件
find.-type s
查找所有的目录
find.-type d
查找所有的一般文件
find.-type f
查找所有的隐藏文件
find.-type f-name".*"
查找所有的隐藏目录
find-type d-name".*"
12.通过和其他文件比较修改时间查找文件
显示在指定文件之后做出修改的文件。下面的find命令将显示所有的在ordinary_file之后创建修改的文件。
复制代码代码如下:
ls-lrt
total 0
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
---------- 1 root root 0 2009-02-19 20:31 no_for_all
# find-newer ordinary_file
.
./everybody_read
./all_for_all
./no_for_all
13.通过文件大小查找文件
使用-size选项可以通过文件大小查找文件。
查找比指定文件大的文件
find~-size+100M
查找比指定文件小的文件
find~-size-100M
查找符合给定大小的文件
find~-size 100M
注意:–指比给定尺寸小,+指比给定尺寸大。没有符号代表和给定尺寸完全一样大。
14.给常用find操作取别名
若你发现有些东西很有用,你可以给他取别名。并且在任何你希望的地方执行。
复制代码代码如下:
常用的删除a.out文件。
alias rmao="find.-iname a.out-exec rm{} \;"
# rmao
删除c程序产生的core文件。
alias rmc="find.-iname core-exec rm{} \;"
# rmc
15.用find命令删除大型打包文件
下面的命令删除大于100M的*.zip文件。
find/-type f-name*.zip-size+100M-exec rm-i{} \;"
用别名rm100m删除所有大雨100M的*.tar文件。使用同样的思想可以创建rm1g,rm2g,rm5g的一类别名来删除所有大于1G,2G,5G的文件。
复制代码代码如下:
alias rm100m="find/-type f-name*.tar-size+100M-exec rm-i{} \;"
# alias rm1g="find/-type f-name*.tar-size+1G-exec rm-i{} \;"
# alias rm2g="find/-type f-name*.tar-size+2G-exec rm-i{} \;"
# alias rm5g="find/-type f-name*.tar-size+5G-exec rm-i{} \;"
# rm100m
# rm1g
# rm2g
# rm5g
批处理文件中 find 命令的例子
find命令的基本格式是这样的:find"要查找的字符串"要查找的文件,在这里,"要查找的字符串"这个内容是必不可少的,引号也是必须的。例如:find"bathome" d:\test.txt,表示在D盘根目录下的文本文件test.txt中查找含有 bathome这一字符串的所有行。
find的结果将会有两种情况:
1、当文件中包含要查找的字符串时,将返回这个字符串所在位置的整行内容,具体格式为:第一行是"----------×××"(×××表示被查找的文件名,不包括引号对),第二行开始才出现包含字符串的整行内容;
2、当文件中没有出现要查找的字符串时,find的结果仅仅返回"----------×××"这一行内容(×××表示被查找的文件名,不包括引号对)。
在查找指定字符串的时候,有的场合需要区分大小写,有的场合则对大小写并不在意,如何实现这些需求呢?
很简单,在find的时候,添加或取消/i开关就是了,具体用法为:find/i"Abc" test.txt表示不区分大小写,文本内容中含有 Abc、abc、ABC之类的都算;find"Abc" test.txt则严格区分字符大小写,只能匹配Abc,而不能匹配abc、ABC之类的字符。
有时候,我们的需求并不是为了查找到某个字符串,而是要检测哪些行不含有特定的字符串,这个时候,可以使用开关/v,用法为:find/v"Abc" test.txt,它表示查找那些不含字符串Abc的行(Abc要区分大小写),如果不区分abc的大小写,那么,应该写成 find/i/v"Abc" test.txt。
有时候,我们的要求很简单,仅仅只是想统计包含某个字符串的行总共有多少,这个时候,应该使用开关/c,写成 find/c"abc" test.txt。
如果要在每行的行首显示行号,怎么办?那就写成 find/n"abc" test.txt吧,它会把test.txt的内容都显示出来,与原文不一样的是,在每行内容的行首,都加上了行号——注意,它仅仅是在显示的时候加上行号而已,并没有真正改写文件的内容。
如果你看到这样的命令:find/i/v/n"Abc" test.txt,请一点要先沉住气,不要被众多的开关弄得眼花缭乱吓趴下了,仔细对照上面的解释,相信你很快就会理解它的功能:在test.txt文件中,查找不包含字符串Abc的所有行,并在行首标上这些行的行号,查找的时候,字符串Abc不区分大小写。
要是使用这样的语句:find/c/n"abc" test.txt,会出现什么样的结果呢?答案是:开关/n会被忽略掉,最终结果不会显示带行号的行内容,只会显示匹配的总行数而已。
echo abcdef|find"abc",见过这种写法吗?它的含义是:在字符串abcdef中,检测是否存在字符串abc,也就是说,find支持管道符号,把管道符号之前的语句的执行结果,作为指定字符串的查找对象,甚至,你可以使用这样的语句:find"abc" test.txt|find"xyz",它表示在test.txt中查找同时存在字符串abc和字符串xyz的行,只要你愿意,你可以继续用管道符号把这个find语句连接下去,我们把这个过程称为多重过滤。
在前面,我们说过,在 find"要查找的字符串"要查找的文件这条命令语句中,引号是必须的,要是我们要查找的内容就是双引号本身,那又该怎么办?
答案很简单:把双引号本身先用双引号转义,再放到双引号对中,写成 find"""" test.txt的格式,如果要查找两个连续的双引号,则应该写成 find"""""" test.txt。
如果你想查找两行之间的字符块,我劝你趁早放弃这个疯狂的想法,因为,find仅仅针对位于同一行上的字符串,不能查找跨行的字符块。
与findstr命令相比,find的功能确实有限得多,仅仅因为不支持正则表达式这一点,就有不少人把它视为鸡肋,从而遭到无情的抛弃。
然而,find并非一无是处,凭借自己的独门绝技,在与findstr的竞争中,它挣得了一席之地。
这些独门绝技是什么呢?(感谢BatCoder的提醒和zqz0012005的补充)
1、统计含指定字符串的总行数。find/c"abc" test.txt可以统计test.txt中含有字符串abc的总行数,而findstr则没有直接提供该功能,需要配合for语句才能实现;
2、find可以读取Unicode格式的文本,而findstr则不行;
3、find可以过滤某些特殊字符,而findstr则不行,比如,我们在使用fsutil fsinfo drives语句查询磁盘分区的时候,如果想让盘符分行显示而不是显示在同一行上的时候(这在用for语句提取盘符的时候很有用),find可以大显身手,而findstr只能干瞪眼了,具体语句为: fsutil fsinfo drives|find/v""