Linux 命令大全:https://www.runoob.com/linux/linux-command-manual.html
1、locate
locate 命令其实是 "find -name" 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库( /var/lib/locatedb ),这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用 locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,先使用 updatedb 命令手动更新数据库,或者 crontab(定时执行) 定时更新。
总结:
- locate 的速度比 find 快,因为它并不是真的查找文件,而是查数据库
- locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护.
- locate 的升级数据库命令:locate --u #注意之间有空格
/etc/updatedb.conf 配置文件解析:
1) PRUNE_BIND_MOUNTS = "yes"
值为"yes"时开启搜索限制,此时,下边的配置生效;为"no"时关闭搜索限制。
2) PRUNEFS =
后边跟搜索时,不搜索的文件系统。
3) PRUNENAMES =
后边跟搜索时,不搜索的文件类型。
4) PRUNEPATHS =
后边跟搜索时,不搜索的文件所在的路径。
常用选项
"locate -c" 查询指定文件的数目。(c为count的意思)
"locate -e" 只显示当前存在的文件条目。(e为existing的意思)
"locate -h" 显示"locate"命令的帮助信息。(h为help的意思)
"locate -i" 查找时忽略大小写区别。(i为ignore的意思)
"locate -n" 最大显示条数" 至多显示"最大显示条数"条查询到的内容。
"locate -r" 使用正则运算式做寻找的条件。(r为regexp的意思)
帮助
用法: locate [OPTION]... [PATTERN]...
说明:在 mlocate 数据库进行搜索.
-b, --basename match only the base name of path names
-c, --count 打印查到到的数量
-d, --database DBPATH 使用 DBPATH 代替默认的 database( 默认是 /var/lib/mlocate/mlocate.db)
-e, --existing 只打印存在的文件
-L, --follow 检查文件是否存在时,跟随符号链接 (默认)-P, --nofollow, -H 检查文件是否存在时,不跟随符号链接
-h, --help 查看帮助
-i, --ignore-case 要忽略的 文件
-l, --limit, -n LIMIT 限制输出数量
-m, --mmap 为向后兼容而忽略
-0, --null 在输出上使用NUL分隔条目
-S, --statistics 查看统计信息,目录,文件,大小 使用情况
-q, --quiet 静默模式
-r, --regexp REGEXP 使用正则进行搜索
--regex 使用扩展正则进行搜索
-s, --stdio 为向后兼容而忽略
-V, --version 查看版本
-w, --wholename 匹配完成路径名
使用示例
示例:locate /etc/sh 搜索etc目录下所有以sh开头的文件。
示例:locate -i ~/m 搜索用户主目录下,所有以m开头的文件,并且忽略大小写。locate /etc/sh 查找/etc/sh*
locate -n 5 apache 只找带有apache目录,显示其中5行
locate -r makefile$ 查找结尾为makefile的文件目录
locate -n 3 -r ^\/opt 查找以/opt开头的目录,且只显示3行
locate -i /HTTP 查找/HTTP目录,忽略大小写
locate -c httpd.conf 统计查找到的数量
cat /etc/updatedb.conf 配置文件
2、whereis
whereis 命令会在特定目录中查找 "二进制文件、源代码文件、man手册"。
- 二进制文件(参数-b)
- man说明文件(参数-m)
- 源代码文件(参数-s)
- 如果省略参数,则返回所有信息
whereis 只能用于查找二进制文件、源代码文件和man手册页。
语法:whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]
参数:
- -b 只查找二进制文件。
- -B<目录> 只在设置的目录下查找二进制文件。
- -f 不显示文件名前的路径名称。
- -m 只查找说明文件。
- -M<目录> 只在设置的目录下查找说明文件。
- -s 只查找原始代码文件。
- -S<目录> 只在设置的目录下查找原始代码文件。
- -u 查找不包含指定类型的文件。
使用 示例:
whereis grep
whereis bash
whereis -b bash
whereis -m bashwhereis -b bash #显示bash 命令的二进制程序
whereis -m bash #显示bash 命令的帮助文件
3、which
which 会在在 PATH 变量指定的路径中去搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用 which 命令可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
简单来说,which指令会在环境变量$PATH设置的目录里查找符合条件的文件。
语法:which [文件...]
- -n<文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
- -p<文件名长度> 与-n参数相同,但此处的<文件名长度>包括了文件的路径。
- -w 指定输出时栏位的宽度。
- -V 显示版本信息。
示例:which grep
示例:which bash
4、fd 命令
github:https://github.com/sharkdp/fd
推荐:fd + rg 一块使用,神组合。fd 并不是完全替代find,而是提供简单的用法、更容易的搜索和更好的性能。在您的武器库中,fd不需要太多的空间,是一个很好的工具。
fd 命令并不意味着要取代传统的 find 命令,后者在Linux上一直存在。相反,fd 试图以更直接的方式满足find的大多数常用用法,而且它通常比find快八到九倍。可以在项目的GitHub存储库页面上看到它的一些基准测试。
fd 具有彩色输出,类似于某些ls模式。它是递归的,但默认情况下不搜索隐藏的目录。它了解Git,还将自动忽略“.gitignore”文件中的任何模式。
fd 默认不区分大小写。但是,如果您的搜索模式包含一个大写字母,fd将以区分大小写的模式运行。当然,您可以重写默认值,但是在许多情况下,它们对您是有利的。
安装:sudo apt install fd-find
帮助、参数
在Ubuntu中,命令是 fdfind,以避免与另一个现有的实用程序发生名称冲突。如果希望它是fd,可以设置一个别名:alias fd=fdfind,在其他Linux发行版中,可以键入 fd 而不是 fdfind
fd --help 或者 fd -h
用法:fd [OPTIONS] [pattern] [path]...
Arguments:
[pattern] 搜索表达式 (正则表达式, 不需要加 --glob 参数)
[path]... 要进行搜索的根目录 (optional)Options:
-H, --hidden 搜索隐藏的文件、目录
-I, --no-ignore 搜索时忽略的文件(git|fd)
-s, --case-sensitive 大小写敏感 (default: smart case)
-i, --ignore-case 大小写不敏感 (default: smart case)
-g, --glob 精确匹配搜索 ( 不加这个是正则搜索)
-a, --absolute-path 显示绝对路径,而不是显示相对路径
-l, --list-details 使用长列表格式显示文件
-L, --follow 跟随 符号连接
-p, --full-path 带上路径搜索,默认只搜索文件名。
-d, --max-depth <depth> 设置最大搜索深度 (default: none)
-E, --exclude <pattern> Exclude entries that match the given glob pattern
-t, --type <filetype> 通过类型过滤: file (f), directory (d), symlink (l),
executable (x), empty (e), socket (s), pipe (p),
block-device (b), char-device (c)示例:fdfind -td images 搜索一个名为 images 的目录
示例:fdfind -tf linux 搜索文件名中包含“linux”的文件,不区分大小写
示例:fdfind -tf Linux 搜索文件名中包含“Linux”的文件,只搜索大写
-e, --extension <ext> 通过扩展名过滤,不必在扩展名前加句点(.),也不区分大小写。
-S, --size <size> 根据文件大小限制结果
--changed-within <date|dur> 根据修改时间过滤 (比xxx时间新的)
--changed-before <date|dur> 根据修改时间过滤 (比xxx时间旧的)
-o, --owner <user:group> 根据 user and/or group 过滤
-x, --exec <cmd>... 对每个搜索结果执行命令,在找到的每个文件上启动命令并执行它。
-X, --exec-batch <cmd>... 对所有搜索结果执行一次命令
-c, --color <when> 什么时候使用颜色 [默认: auto] [可能的值: auto, always, never]
-h, --help 帮助
-V, --version 版本
使用 示例
fd 单个 fd 相当于 ls -R
fd filename 简单搜索
fd '^x.*rc$' 正则搜索
fd passwd /etc 在“/etc”目录中开始搜索,并查找文件名中包含“passwd”的文件:
fd -e rs mod 根据文件扩展名搜索,可以指定多个扩展名
fd -g libc.so /usr 精确搜索
fd -H pre-commit 不指定-H时,fd不会搜索隐藏的目录,也不会显示隐藏的文件
fd -I num_cpu 忽略文件或者文件夹 -I (or --no-ignore)
fd -p -g '**/.git/config' 加上路径匹配搜索(--full-path 或者 -p)
fd -p '.*/lesson-\d+/[a-z]+.(jpg|png)'fdfind -e c linuxmi 搜索所有C源代码文件的名称中包含“linuxmi”的文件:
fd -e zip -x unzip 递归查找所有zip文件,并解压fd -e h -e cpp -x clang-format -i
fd -g 'test_*.py' -X vim 查找所有 test_*.py 并用vim打开
fd … -X ls -lhd --color=always
fd -e cpp -e cxx -e h -e hpp -X rg 'std::cout'
fd -e jpg -x convert {} {.}.png 转换 *.jpg 到 *.png
fd -tf -x md5sum > file_checksums.txt排除指定的文件和目录
fd -H -E .git …
fd -E /mnt/external-drive …
fd -E '*.bak' …删除文件
fd -H '^\.DS_Store$' -tf -X rm
fd -H '^\.DS_Store$' -tf -X rm -i
关于 占位符
示例,解压缩当前工作目录中的文件:king@kali:/data$ fdfind -e zip -x unzip {}
如果想把它解压缩到包含ZIP文件的目录中,可以使用以下占位符之一:
- {} 一个占位符,它将随着搜索结果的路径改变 (wp-content/uploads/01.jpg)
- {.} 类似于{},但不使用文件扩展名 (wp-content/uploads/01)
- {/} 将被搜索结果的基本名称 (01.jpg) 所取代的占位符
- {//} 发现路径的父目录 (wp-content/uploading)
- {/.} 只有基本名称,没有扩展名(01)。
为了找到我们的ZIP文件并将其解压缩到包含它的目录中,我们可以使用 unzip -d(目录)选项,并传入父目录占位符({//}):fdfind -e zip -x unzip {} -d {//} 然后将ZIP文件定位并解压缩到其父目录中。
5、find
Linux find命令:在目录中查找文件(超详解):https://c.biancheng.net/view/779.html
find 用法
用法:find path -option [ -print ] [ -exec -ok command ] {} \;
- path : find 命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
- -print: 将查找到的文件输出到 屏幕(标准输出)。
- -exec: 对查找到的文件执行所给出的 shell 命令。命令的形式为 "-exec command {} \; ",注意 { } 和 \;之间的空格。示例:find . -type f -exec ls -l {} \; 查当前目录下的所有普通文件
- -ok: -ok 和 -exec 相同,只不过在操作前要询用户。
find / -name filename -exec rm -rf {} \;
find / -name filename -ok rm -rf {} \;
find 命令部分选项。find命令有很多选项或表达式,每一个选项前面跟随一个横杠-。
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune选项将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
find命令还有-atime和-ctime选项,但它们都和-mtime选项相似,所以我们在这里只介绍-mtime选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录
使用 name 选项
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,
使用~作为'pathname参数,波浪号~代表了你的$HOME目录。
$ find ~ -name "*.txt" -print 在家目录及子目录中查找所有的‘*.txt’文件
$ find . -name "*.txt" -print 在当前目录及子目录中查找所有的‘*.txt’文件
$ find . -name "[A-Z]*" -print 当前目录及子目录中查找文件名以一个大写字母开头的文件
$ find /etc -name "host*" -print 在/etc目录中查找文件名以host开头的文件
$ find ~ -name "*" -pri或ntf ind . -print 查找$HOME目录中的文件
$ find / -name "*" -print 从根目录开始查找(太消耗系统资源,不建议使用,如果好似用可以加上 & ,让后台执行)
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$ find . -name "[a-z][a-z][0-9][0-9].txt" -print
使用 perm 选项
如果希望按照文件权限模式来查找文件的话,可以采用-perm选项。
你可能需要找到所有用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。
在使用这一选项的时候,最好使用八进制的权限表示法。
为了在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print
如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们可以使用find命令的-perm选项。
在八进制数字前面要加一个横杠-。
在下面的命令中-perm代表按照文件权限查找,而‘007’和你在chmod命令的绝对模式中所采用的表示法完全相同。
$ find . -perm -007 -print
忽略 某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。
在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
$ find /apps -name "/apps/bin" -prune -o -print
使用 user 和 nouser 选项
如果希望按照文件属主查找文件,可以给出相应的用户名。
例如,在$HOME目录中查找文件属主为dave的文件,可以用:
$ find ~ -user dave -print
在/etc目录下查找文件属主为uucp的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主
在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令
能够为你完成相应的工作。例如,希望在/home目录下查找所有的这类文件,可以用:
$ find /home -nouser -print
使用 group 和 nogroup 选项
就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为
了在/apps目录下查找属于accts用户组的文件,可以用:
$ find /apps -group accts -print
要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件
系统的根目录处查找这样的文件
$ fine/-nogroup-print
按照更改时间查找文件
如果希望按照更改时间来查找文件,可以使用mtime选项。如果系统突然没有可用空间了,
很有可能某一个文件的长度在此期间增长迅速,这时就可以用 mtime 选项来查找这样的文件。用减号-来限定更改时间在距今n日以内的文件,
用加号+来限定更改时间在距今n日以前的文件。希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print
查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。
它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。这里有两个文件,它们的更改时间大约相差两天。
下面给出的find命令能够查找更改时间比文件age.awk新但比文件belts.awk旧的文件:
如果想使用find命令的这一选项来查找更改时间在两个小时以内的文件,
除非有一个现成的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。
为了解决这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用 touch 命令来实现。
假设现在的时间是 23:40,希望查找更改时间在两个小时以内的文件,
可以首先创建这样一个文件:一个符合要求的文件已经被创建;这里我们假设今天是五月四日,
而该文件的更改时间是 21:40,比现在刚好早两个小时。
现在我们就可以使用 find 命令的 -newer 选项在当前目录下查找所有更改时间在两个小时以内的文件:
$ find . -newer dstamp -print
使用 type 选项
UNIX 或 LINUX 系统中有若干种不同的文件类型,这部分内容我们在前面的章节已经做了介绍,这里就不再赘述。
如果要在 /etc 目录下查找所有的目录,可以用:
$ find /etc -type d -print
为了在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
为了在/ e t c目录下查找所有的符号链接文件,可以用:
$ find /etc -type l -print
使用 size 选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块( block)来计量,也可以用字节来计量。
以字节计量文件长度的表达形式为 Nc;以块计量文件长度只用数字表示即可。
就我个人而言,我总是使用以字节计的方式,在按照文件长度查找文件时,
大多数人都喜欢使用这种以字节表示的文件长度,而不用块的数目来表示,
除非是在查看文件系统的大小,因为这时使用块来计量更容易转换。
为了在当前目录下查找文件长度大于 1M字节的文件,可以用:
$ find . -size +1000000c -print
为了在 /home/apache 目录下查找文件长度恰好为 100字节的文件,可以用:
$ find /home/apache -size 100c -print
为了在当前目录下查找长度超过 10 块的文件(一块等于 512字节),可以用:
$ find . -size +10 -print
使用 depth 选项
在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用 depth选项就
可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,
希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print
使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。
在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以X C结尾的文件:
$ find . -name "*.XC" -mount -print
使用 cpio 选项
cpio命令可以用来向磁带设备备份文件或从中恢复文件。可以使用find命令在整个文件系
统中(更多的情况下是在部分文件系统中)查找文件,然后用cpio命令将其备份到磁带上。
如果希望使用cpio命令备份/etc、/home和/apps目录中的文件,可以使用下面所给出的命令,
不过要记住你是在文件系统的根目录下:(在上面的例子中,第一行末尾的\告诉shell命令还未结束,忽略\后面的回车。)
在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。
之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。
例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。
如果在备份时使用了绝对路径,例如/etc,那么在恢复时,就只能恢复到/etc目录中去,别无其他选择。
在上面的例子中,我告诉find命令首先进入/ e t c目录,然后是/home和/apps目录,先匹配这些目录下的文件,
然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份。
顺便说一下,在上面的例子中cpio命令使用了C65536选项,我本可以使用B选项,不过这
样每块的大小只有 512 字节,而使用了C65536 选项后,块的大小变成了 64K 字节(65536 / 1024)。
使用 exec 或 ok 来执行 shell 命令
当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用 -exec选项。
一旦find命令匹配到了相应的文件,就可以用 -exec选项中的命令对其进行操作
(在有些操作系统中只允许 -exec 选项执行诸如 ls 或 ls -l这样的命令)。
大多数用户使用这一选项是为了查找旧文件并删除它们。
这里我强烈地建议你在真正执行 rm 命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。
exec选项后面跟随着所要执行的命令,然后是一对儿{ },一个空格和一个\,最后是一个分号。
为了使用 exec 选项,必须要同时使用 print 选项。
如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的 -exec选项中,
例如:上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在 -exec 选项中使用ls -l 命令将它们列出。
为了在 /logs目录中查找更改时间在5日以前的文件并删除它们,可以用:
$ find logs -type f -mtime +5 -exec rm {} \;
记住,在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!
当使用诸如 mv 或 rm 命令时,可以使用 -exec选项的安全模式。
它将在对每个匹配到的文件进行操作之前提示你。
在下面的例子中, find 命令在当前目录中查找所有文件名以 .LOG 结尾、更改时间在5日以上的文件,并删除它们,
只不过在删除之前先给出提示。按y键删除文件,按n键不删除。
任何形式的命令都可以在 -exec 选项中使用。
在下面的例子中我们使用 grep 命令。
首先匹配所有文件名为 “passwd*”的文件,例如passwd、passwd.old、passwd.bak,
然后执行 grep 命令看看在这些文件中是否存在一个 rounder用户。
find命令的例子
我们已经介绍了find命令的基本选项,下面给出find命令的一些其他的例子。
为了匹配 $HOME 目录下的所有文件,下面两种方法都可以使用:
$ find $HOME -print
$ find ~ -print
为了在当前目录中查找 suid 置位,文件属主具有读、写、执行权限,并且文件所属组的用
户和其他用户具有读和执行的权限的文件,可以用:
$ find . -type f -perm 4755 -print
为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:
$ find / -type f -size 0 -exec ls -l {} \;
为了查找 /var/logs 目录中更改时间在7日以前的普通文件,并删除它们,可以用:
$ find /var/logs -type f -mtime +7 -exec rm {} \;
为了查找系统中所有属于 audit 组的文件,可以用:
$find /-name -group audit -print
我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,
这样我们一眼就可以看出哪个文件是最新的,哪个是最旧的。
admin.log 文件编上了序号:admin.log.001、admin.log.002等等。
下面的find命令将删除 /logs 目录中访问时间在7日以前、含有数字后缀的 admin.log 文件。
该命令只检查三位数字,所以相应日志文件的后缀不要超过 999。
$ find /logs -name 'admin.log[0-9][0-9]'[-0a-t9i]me +7 -exec rm {} \;
为了查找当前文件系统中的所有目录并排序,可以用:
$ find . -type d -print -local -mount |sort
为了查找系统中所有的r m t磁带设备,可以用:
$ find /dev/rmt -print
find 使用 示例
在/usr/linux中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名,有以下几种方法实现
find /usr/linux -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
grep SYSCALL_VECTOR /usr/linux/*.h | cut -d’:’ -f1 | uniq > filename
find /usr/linux -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print$find . -name .svn | xargs rm -rf
$find ~ -name "*.txt" -print # 在$HOME中查.txt文件并显示
$find . -name "*.txt" -print
$find . -name "[A-Z]*" -print #查以大写字母开头的文件
$find /etc -name "host*" -print #查以host开头的文件
$find . -name "[a-z][a-z][0–9][0–9].txt" -print #查以两个小写字母和两个数字开头的txt文件find -name ".*" -perm -007
find -name ".*" -perm 755$find . -perm 755 -print
$find . -perm -007 -exec ls -l {} \; #查所有用户都可读写执行的文件同-perm 777
$find . -type d -print
$find . ! -type d -print
$find . -type l -print$find . -size +1000000c -print #查长度大于1Mb的文件
$find . -size 100c -print # 查长度为100c的文件
$find . -size +10 -print #查长度超过期作废10块的文件(1块=512字节)$cd /
$find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
$find /etc -name "passwd*" -exec grep "cnscn" {} \; #看是否存在cnscn用户
$find . -name "yao*" | xargs file
$find . -name "yao*" | xargs echo "" > /tmp/core.log
$find . -name "yao*" | xargs chmod o-wfind logs -type f -mtime +5 -exec -ok rm {} \; 在/logs目录中查找更改时间在5日以前的文件并删除它们:
find ./ -mtime -1 -type f -exec ls -l {} \; 查询当天修改过的文件
find ./ -mtime -1 -type f -ok ls -l {} \; 查询文件并询问是否要显示
who | awk '{print $1"\t"$2}' 查询并交给awk去处理
df -k | awk '{print $1}' | grep -v 'none' | sed s"/\/dev\///g"
df -k | awk '{print $1}' | grep -v 'none'
find -name april* 在当前目录下查找以april开始的文件
find -name april* fprint file 在当前目录下查找以april开始的文件,并把结果输出到file中
find -name ap* -o -name may* 查找以ap或may开头的文件
find /mnt -name tom.txt -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find /tmp -name wa* -type l 在/tmp下查找名为wa开头且类型为符号链接的文件
find /home -mtime -2 在/home下查最近两天内改动过的文件
find /home -atime -1 查1天之内被存取过的文件
find /home -mmin +60 在/home下查60分钟前改动过的文件
find /home -amin +30 查最近30分钟前被存取过的文件
find /home -newer tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录
find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录
find /home -used -2 列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find /home -user cnscn 列出/home目录内属于用户cnscn的文件或目录
find /home -uid +501 列出/home目录内用户的识别码大于501的文件或目录
find /home -group cnscn 列出/home内组为cnscn的文件或目录
find /home -gid 501 列出/home内组id为501的文件或目录
find /home -nouser 列出/home内不属于本地用户的文件或目录
find /home -nogroup 列出/home内不属于本地组的文件或目录
find /home -name tmp.txt -maxdepth 4 列出/home内的tmp.txt 查时深度最多为3层
find /home -name tmp.txt -mindepth 3 从第2层开始查
find /home -empty 查找大小为0的文件或空目录
find /home -size +512k 查大于512k的文件
find /home -size -512k 查小于512k的文件find . -size +3000k -exec ls -ld {} ; 要查找磁盘中大于3M的文件
find /home -links +2 查硬连接数大于2的文件或目录
find /home -perm 0700 查权限为700的文件或目录
find /tmp -name tmp.txt -exec cat {} \;
find /tmp -name tmp.txt -ok rm {} \;find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件
find *.c -exec cp '{}' /tmp ';' 将 find 出来的东西拷到另一个地方
如果有特殊文件,可以用cpio 也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir
find查找某一天更改的文件
A=`find ~ -print` | ls -l –full-time $A 2>/dev/null | grep "Jun 27" | grep 1998
查找某个时间段,比如11点到12点的。
ls -l $*|awk ‘{split($8,hour,":");if((hour[1]>23 || hour[1] < 1)&&hour[1]<24)print}’
到要查找的目录下,运行
find ./ -name "*" -exec judgetime {} \;
注意时间格式为24小时制。如果我要精确到分钟呢
touch -t 04241112 starttemp #精确到12分钟
touch -t 04241220 endtemp #截止到12点20
find [dir] -newer starttemp -a ! -newer endtemp -exec ls -l {} \;
删除指定日期的文件
find ./ -name 文件名 -exec rm -f {} \;
删除当前30天内没用过的文件,用如下命令:
find / -atime +30 -exec rm -f {} \;
删除多少天之前的文件
find /yourpath -mtime +31 -exec rm {} \;
find /yourpath -mtime +366 -exec rm {} \;
用 -newer 选项
find . -newer test -print
6、grep、ripgrep
ripgrep:https://github.com/BurntSushi/ripgrep/
grep 命令
Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
语法
grep [options] pattern [files] 或 grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
- pattern - 表示要查找的字符串或正则表达式。
- files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。
常用选项::
-i
:忽略大小写进行匹配。-v
:反向查找,只打印不匹配的行。-n
:显示匹配行的行号。-r
:递归查找子目录中的文件。-l
:只打印匹配的文件名。-c
:只打印匹配的行数。更多参数说明:
- -a 或 --text : 不要忽略二进制的数据。
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c 或 --count : 计算符合样式的列数。
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
- -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
- -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
- -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
- -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
- -i 或 --ignore-case : 忽略字符大小写的差别。
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
- -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
- -o 或 --only-matching : 只显示匹配PATTERN 部分。
- -q 或 --quiet或--silent : 不显示任何信息。
- -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
- -s 或 --no-messages : 不显示错误信息。
- -v 或 --invert-match : 显示不包含匹配文本的所有行。
- -V 或 --version : 显示版本信息。
- -w 或 --word-regexp : 只显示全字符合的列。
- -x --line-regexp : 只显示全列符合的列。
- -y : 此参数的效果和指定"-i"参数相同。
-? 同时显示匹配行上下的?行,如:grep -2 pattern filename 同时显示匹配行的上下2行。
-b,—byte-offset 打印匹配行前面打印该行所在的块号码。
-c,—count 只打印匹配的行数,不显示匹配的内容。
-f File,—file=File 从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。
-h,—no-filename 当搜索多个文件时,不显示匹配文件名前缀。
-i,—ignore-case 忽略大小写差别。
-q,—quiet 取消显示,只返回退出状态。0则表示找到了匹配的行。
-l,—files-with-matches 打印匹配模板的文件清单。
-L,—files-without-match 打印不匹配模板的文件清单。
-n,—line-number 在匹配的行前面打印行号。
-s,—silent 不显示关于不存在或者无法读取文件的错误信息。
-v,—revert-match 反检索,只显示不匹配的行。
-w,—word-regexp 如果被\<和>引用,就把表达式做为一个单词搜索。
-V,—version 显示软件版本信息。
pattern为所要匹配的字符串,可使用下列模式
- . 匹配任意一个字符
- * 匹配 0 个或多个 * 前的字符
- ^ 匹配行开头
- $ 匹配行结尾
- [] 匹配 [ ] 中的任意一个字符,[] 中可用 - 表示范围,
- 例如 [a-z] 表示字母 a 至z 中的任意一个
- \ 转意字符
ls -l | grep '^a' 通过管道过滤ls -l输出的内容,只显示以a开头的行。
grep 'test' d* 显示所有以d开头的文件中包含test的行。
grep 'test' aa bb cc 显示在aa,bb,cc文件中匹配test的行。
grep '[a-z]' aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
grep 'w(es)t.*' aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(),找到就显示该行。如果用egrep或grep -E,就不用""号进行转义,直接写成'w(es)t.*'就可以了。
grep -i pattern files :不区分大小写地搜索。默认情况区分大小写
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
使用 示例
1、在文件 file.txt 中查找字符串 "hello",并打印匹配的行
:grep hello file.txt
2、在文件夹 dir 中递归查找所有文件中匹配正则表达式 "pattern" 的行,并打印匹配行所在的文件名和行号
:grep -r -n pattern dir/
3、在标准输入中查找字符串 "world",并只打印匹配的行数:echo "hello world" | grep -c world
4、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令
:grep test *file
:grep test test* #查找前缀有“test”的文件包含“test”字符串的文件
5、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为
:grep -r update /etc/acpi
:grep -r update /etc/acpi #以递归的方式查找“etc/acpi”
6、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:grep -v test *test*
:grep-v test* #查找文件名中包含test 的文件中不包含test 的行
从文件内容查找匹配指定字符串的行
:$ grep "被查找的字符串" 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
grep "thermcontact" /.in
从文件内容查找与正则表达式匹配的行:
$ grep –e "正则表达式" 文件名
查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:
$ find / -type f -name "*.log" | xargs grep "ERROR"
例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:
find . -name "*.in" | xargs grep "thermcontact"
ripgrep 命令
github:https://github.com/BurntSushi/ripgrep/
ripgrep 是一个替代 grep (或者说 GNU grep)命令的搜索工具。其主要特点是命令的使用更为方便实用,以及搜索性能极高,在庞大的项目中有着出色的表现。并且默认可以忽略 .gitignore 文件中的内容,非常实用。
安装:sudo apt-get install ripgrep
参数:rg --help
ripgrep 有许多参数,下面的参数是经常用
- -h: Show ripgrep's condensed help output.
- --help: 帮助
- -i/--ignore-case: 忽略大小写
- -S/--smart-case: 跟 --ignore-case 相似
- -F/--fixed-strings: 禁用正则表达式匹配并将模式视为字面值字符串。
- -w/--word-regexp: 要求模式的所有匹配都被单词边界包围。也就是说,给定模式,——word-regexp标志将导致ripgrep的行为就好像pattern实际上是\b(?:pattern)\b一样。
- -c/--count: 报告匹配行的总数。
- --files: 打印ripgrep要搜索的文件,但实际上没搜到。
- -a/--text: 像搜索纯文本一样搜索二进制文件。
- -U/--multiline: 允许匹配跨越多行。
- -z/--search-zip: 搜索压缩文件(gzip, bzip2, lzma, xz, lz4, brotli, zstd)。这在默认情况下是禁用的。
- -C/--context: 显示匹配到内容的上下周围内容
- --sort path: 强制ripgrep按文件名对输出进行排序。(这会禁用并行性,因此可能会更慢。)
- -L/--follow: 在递归搜索时跟随符号链接。
- -M/--max-columns: 限制ripgrep打印的行长度。
- --debug: 显示ripgrep的调试输出。这对于理解为什么某个文件可能会在搜索中被忽略,或者ripgrep正在从环境中加载什么类型的配置非常有用。
用户手册
:https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md
日常基本只用到这些,比使用 grep 简短许多!
1. 默认用法:在当前目录下的所有文件内容中,递归搜索字符串。例如,搜索 "hello":$ rg hello
ripgrep 的输入认为是正则表达式,因此一些字符需要转义(并由于 bash/zsh 也识别正则表达式的原因需加单引号),例如,如果要搜索 "main()":
$ rg 'main\(\)'
test.cpp
13:int main() {
2. 查看上下文, -A 表示 "after" 的行数, -B 表示 "before" 的行数:$ rg somebody -A 2 -B 2
test.txt
4-They'd banish us, you know.
5-
6:How dreary to be somebody!
7-How public, like a frog
8-To tell your name the livelong day
3. 在特定文件名模式中搜索,使用 -g 参数(全称 --glob ):$ rg main -g '*.cpp'
4. 在当前目录及其所有子目录中搜索文件名:$ rg --files | rg test
7、xargs
xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
由于很多命令不支持|管道来传递参数,所以就有了 xargs 命令,例如:
find /sbin -perm +700 | ls -l # 这个命令是错误的
find /sbin -perm +700 | xargs ls -l # 这样才是正确的xargs 命令特别是与 find 命令一起使用。
find 命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像 -exec 选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用 xargs 命令则只有一个进程。
命令格式、参数
xargs 一般是和管道一起使用。命令格式:somecommand | xargs -item command
xargs 可以一次获取所有的参数,也可以分批获取参数。
参数:
- -a file 从文件中读入作为 stdin
- -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
- -p 当每次执行一个argument的时候询问一次用户。
- -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
- -t 表示先打印命令,然后再执行。
- -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
- -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
- -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
- -L num 从标准输入一次读取 num 行送给 command 命令。
- -l 同 -L。
- -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
- -x exit的意思,主要是配合-s使用。。
- -P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
使用 示例
xargs 用作替换工具,读取输入数据重新格式化后输出。
定义一个测试文件,内有多行文本数据:cat test.txt
a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z
多行输入、单行输出
:cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
-n 选项多行输出
:cat test.txt | xargs -n3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
-d 自定义 定界符
:echo "nameXnameXnameXname" | xargs -dX
name name name name
结合 -n
:echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
读取 stdin,将格式化后的参数传递给命令
假设一个命令为 sk.sh 和一个保存参数的文件 arg.txt:
#!/bin/bash
#sk.sh命令内容,打印出所有参数。
echo $*
arg.txt 文件内容:cat arg.txt
aaa
bbb
ccc
xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:
# cat arg.txt | xargs -I {} ./sk.sh -p {} -l
-p aaa -l
-p bbb -l
-p ccc -l
复制所有图片文件到 /data/images 目录下:ls *.jpg | xargs -n1 -I {} cp {} /data/images
find 命令的 -exec 选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。
然而有些系统对能够传递给 exec 的命令长度有限制,这样在 find 命令运行几分钟之后,就会出现溢出错误。用 xargs 去避免这个问题:find . -type f -name "*.log" -print0 | xargs -0 rm -f
find . -name "core" -print | xargs echo "" >/tmp/core.log
find /apps/audit -perm -7 -print | xargs chmod o-w
find / -type f -print | xargs grep "device"
find . -name *\-type f -print | xargs grep "DBO"
xargs -0 将 \0 作为定界符。
统计目录中所有 php 文件的行数:find . -type f -name "*.php" -print0 | xargs -0 wc -l
查找jpg文件,并压缩它们:find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
下载:cat url-list.txt | xargs wget -c