文件的查找以及软硬链接使用
文件查找的常用命令
-
which
-
whereis
-
grep
-
locate
-
find
1、which
which
命令用于查找系统可执行命令的路径。它通常用于查找命令是否存在以及其所在的位置。
which command
这个命令会查找command
命令是否存在,并显示其路径。
2、whereis
whereis
命令用于查找二进制文件、源代码文件和帮助文件的位置。
whereis command
这个命令会查找command
命令的二进制文件、源代码文件和帮助文件的位置。
3、locate
locate
命令用于快速查找文件名。它使用系统的数据库(通常是mlocate
或updatedb
命令生成的数据库)来查找文件,因此查找速度较快。但是,如果文件数据库未更新,可能找不到最新创建的文件。
数据库位于/var/lib/mlocate/mlocate.db
,这个数据库中存有本地所有的文件信息;这个数据库是Linux自动创建并每天自动更新维护。
相关的配置信息在/etc/updatedb.conf
,查看定时任务信息在/etc/cron.daily/mlocate.cron
locate filename.txt
updatedb(更新数据库)
4、grep
grep
命令用于在文件中搜索指定的字符串模式。虽然它主要用于搜索文件内容,但在文件查找方面也非常有用。
grep [OPTIONS] PATTERN [FILE...]
-
OPTIONS
: 可选参数,用于指定一些选项,例如是否忽略大小写、递归搜索等。 -
PATTERN
: 要搜索的模式,可以是简单字符串或正则表达式 -
FILE
: 要搜索的文件名,可以省略,默认为标准输入(从管道或重定向中读取)
OPTIONS如下:
-
-i
:忽略大小写。使用此选项,搜索将不区分大小写。 -
-v
:反向搜索。打印不包含匹配模式的行。 -
-n
:打印匹配行的行号。 -
-r
:递归搜索目录。在指定目录及其子目录中递归搜索。 -
-w
:匹配整个单词。只匹配包含整个单词的行,而不是部分匹配。 -
-E
:使用扩展的正则表达式。允许使用更多的正则表达式元字符。 -
-F
:将模式视为固定字符串。不将模式视为正则表达式,而是按照普通的字符串进行搜索。 -
-m NUM
:仅显示前NUM个匹配。当找到指定数量的匹配项后,停止搜索。 -
--color=auto
:将匹配的文本高亮显示。 -
--exclude=PATTERN
:在搜索时排除指定模式的文件。 -
--include=PATTERN
:仅搜索指定模式的文件。 -
-q
:安静模式。不显示匹配的行,只返回是否找到匹配项。
以下是一些常见的grep
命令示例:
在文件中搜索字符串:
grep "keyword" filename.txt
[root@fishman-160 ~]# cat a.txt
hello python
today
tomorrow
eof`
[root@fishman-160 ~]# grep -v '^$' a.txt #'^$'代表空行
hello python
today
tomorrow
eof`
这个命令会在filename.txt
文件中搜索包含字符串"keyword"
的行,并将匹配的行打印出来。
忽略大小写搜索:
grep -i "keyword" filename.txt
使用-i
选项可以忽略搜索时的大小写差异,使搜索不区分大小写。
递归搜索目录:
grep -r "pattern" /path/to/search
使用-r
选项可以在指定目录及其子目录中递归搜索指定的模式。
使用正则表达式搜索:
grep -E "pattern" filename.txt
[root@fishman-160 ~]# grep -E -n 'noglin|root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
使用-E
选项可以让grep
使用扩展的正则表达式进行搜索。
打印匹配的行号:
grep -n "pattern" filename.txt
[root@fishman-160 ~]# grep -n 'bash$' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
46:kc:x:1000:1000:kc:/home/kc:/bin/bash
48:test1:x:1300:1000::/media/test1:/bin/bash
使用-n
选项可以在打印匹配的行时同时显示行号。
反向搜索(排除匹配项):
grep -v "pattern" filename.txt
[root@fishman-160 ~]# ps -aux | grep httpd | grep -v 'grep'
root 2007 0.2 0.5 265096 11196 ? Ss 14:40 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2008 0.0 0.4 269796 8376 ? S 14:40 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2009 0.1 0.7 2703900 14060 ? Sl 14:40 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2010 0.1 0.5 2572772 9968 ? Sl 14:40 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2011 0.1 0.5 2507236 9968 ? Sl 14:40 0:00 /usr/sbin/httpd -DFOREGROUND
5、find
find
命令用于在文件系统中递归查找文件和目录。它是Unix和类Unix系统中非常强大和常用的命令之一。find
命令可以根据不同的条件搜索文件,如文件名、文件类型、大小、时间戳、权限等等。
基础语法
find [path] [expression]
参数
-
-name pattern
:按照文件名进行搜索,pattern
是要搜索的文件名模式。可以使用通配符来匹配多个文件名。 -
-iname pattern
:类似于-name
,但忽略搜索时的大小写。 -
-type type
:按照文件类型进行搜索,type
可以是以下之一:-
f
:普通文件 -
d
:目录 -
l
:符号链接 -
b
:块设备文件 -
c
:字符设备文件 -
s
:套接字(socket) -
p
:命名管道(FIFO)
-
-
-size n[cwbkMG]
:按照文件大小进行搜索,n
表示文件大小,后面的字符(c
、w
、b
、k
、M
、G
)表示大小的单位(字节、2字节、512字节块、K字节、M字节、G字节)。 -
-mtime n
:按照文件的修改时间进行搜索,n
表示天数。-mtime +n
表示修改时间在n天前,-mtime -n
表示修改时间在n天内。 -
-user user
:按照文件的属主进行搜索,user
是用户名。 -
-group group
:按照文件的属组进行搜索,group
是组名。 -
-perm mode
:按照文件的权限进行搜索,mode
是三位八进制数,用于匹配文件权限。 -
-empty
:搜索空文件或空目录。 -
-maxdepth n
:设置搜索的最大递归深度。 -
-mindepth n
:设置搜索的最小递归深度。 -
-print
:将搜索到的文件输出到标准输出。 -
-delete
:删除搜索到的文件。 -
-exec command {} \;
:对搜索到的每个文件执行指定的命令,{}
表示找到的文件名,\;
表示命令结束。 -
-xdev
:限制find
命令仅在指定的文件系统上进行搜索 -
-mount
:在查找文件时不跨越文件系统mount点 -
-follow
:如果find命令遇到符号链接文件,就追踪至链接所指向的文件 -
find
命令支持连接符(operators)来组合多个条件进行复杂的搜索。常见的三种连接符是-o
(逻辑或)、-a
(逻辑与)和-not
(逻辑非)。 -
+
表示超过,-
表示低于
以下是一些常见的find
命令使用示例:
1、在当前目录及其子目录中搜索名为"filename.txt"的文件:
find . -name "filename.txt"
.
表示当前目录,-name
用于指定文件名匹配的模式。
例:
[root@fishman-160 ~]# find ./ -maxdepth 1 -name "*.txt"
./4.txt
./1.txt
./aa.txt
./test.txt
./2.txt
./3.txt
2、在指定目录中搜索所有的目录:
find /path/to/search -type d
-type d
表示只搜索目录。
例:
[root@fishman-160 ~]# find /etc -maxdepth 1 -type d
/etc
/etc/dnf
/etc/fonts
/etc/libreport
/etc/sgml
/etc/ssh
/etc/skel
/etc/java
/etc/jvm
/etc/jvm-commmon
/etc/logrotate.d
/etc/X11
/etc/terminfo
/etc/libssh
/etc/pki
/etc/rpm
/etc/lvm
/etc/xml
...
3、在指定目录中搜索大小超过100MB的文件:
find /path/to/search -type f -size +100M
-type f
表示只搜索文件,-size +100M
表示搜索大小大于100MB的文件。
例:
[root@fishman-160 ~]# find /etc -size +50k -a -size -100k -type f | xargs ls -lh
#xargs:用于将find命令找到的文件列表作为参数传递给后面的ls命令。
4、搜索修改时间在30天以前的文件:
find /path/to/search -type f -mtime +30
-mtime +30
表示搜索修改时间在30天以前的文件。
例:
[root@fishman-160 ~]# find -mtime -3 #搜索位于当前目录及其子目录下,最近3天内修改过的文件,
.
./.bash_history
./xuegod.sh
./.bashrc
./.viminfo
./4.txt
./1.txt
./.Xauthority
./.lesshst
./file.bak.tar.gz
./aa.txt
./test.txt
./2.txt
./3.txt
./ls
./dead.letter
5、搜索属主为"username"的文件:
find /path/to/search -type f -user username
-user username
表示搜索属主为"username"的文件。]
例:
[root@fishman-160 ~]# find /home -xdev \( -user kc -type d \) | xargs ls -ld
drwx------. 4 kc kc 42 7月 31 16:16 /home/kc
drwxr-xr-x. 4 kc kc 39 7月 6 13:26 /home/kc/.mozilla
drwxr-xr-x. 2 kc kc 6 1月 20 2022 /home/kc/.mozilla/extensions
drwxr-xr-x. 2 kc kc 6 1月 20 2022 /home/kc/.mozilla/plugins
drwxr-xr-x 8 kc kc 158 6月 13 23:08 /home/kc/nginx-1.25.1
6、搜索具有特定权限的文件:
find /path/to/search -type f -perm 644
例:
[root@fishman-160 ~]# find ~ -perm -u=s -type f | xargs ls -l
-rwsr-xr-x 1 root root 94 7月 31 13:30 /root/xuegod.sh
7、对查询的内容执行相应的操作
例:查找文件大小大于1GB的文件,可以使用以下命令
[root@fishman-160 ~]# find ./ -type f -size +1G | xargs du -h
1.2G ./b.txt
8、查找到大于1G的文件,并删除
[root@fishman-160 ~]# find ./ -type f -size +1G -exec rm -rf {} +
[root@fishman-160 ~]# ls b.txt
ls: 无法访问'b.txt': 没有那个文件或目录
-exec
中的+
和\;
的区别
-e xec选项使用+表示将所有匹配的文件作为一个参数传递command
-exec选项使用\;表示对于每一个匹配的文件,都单独调用一次command
6、命令判断
; #分号; 不考虑指令的相关性,连续执行
&& #逻辑与,它是只有在前面的命令执行成功后,后面的命令才会去执行 ls xx && cd /etc
|| #逻辑或,如果前面的命令执行成功,后面的命令就不去执行了;或者如果前面的执行不成功,才会去执行后面的命令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了