跳转到内容

which和find命令详解

课程介绍

接下来我们来学习文件查找。which命令用于查找可执行程序的路径,比如which ls告诉你ls在哪里;find命令更强大,可以按文件名、大小、修改时间等各种条件查找文件。这两个命令在系统管理和运维中经常用到,一定要掌握。

1. which命令:查找命令路径

命令介绍

which命令用于查找并显示给定命令的完整路径,它会从PATH环境变量中查找命令。

命令语法

bash
which [选项] 命令名

常用选项

选项功能描述
-a显示所有匹配的路径

实操演示

示例1:查找命令路径

bash
# 查找ls命令的路径
$ which ls
/usr/bin/ls

# 查找grep命令的路径
$ which grep
/usr/bin/grep

# 查找python命令的路径
$ which python
/usr/bin/python

示例2:查找所有匹配路径

bash
# 查找所有python路径
$ which -a python
/usr/bin/python
/usr/local/bin/python

# 查找所有java路径
$ which -a java
/usr/bin/java
/usr/local/bin/java

示例3:查找不存在的命令

bash
# 查找不存在的命令
$ which mycommand
# 无输出,表示命令不存在

应用场景

  • 确认命令的实际安装位置
  • 检查系统是否安装了某个命令
  • 查找命令的多个版本

2. find命令:查找文件和目录

命令介绍

find命令是Linux中最强大的文件查找工具,可以根据文件名、大小、修改时间、权限等多种条件查找文件和目录。

命令语法

bash
find [查找路径] [查找条件] [执行动作]

常用查找条件

条件功能描述
-name按文件名查找
-type按文件类型查找
-size按文件大小查找
-mtime按修改时间查找
-user按文件所有者查找
-perm按文件权限查找
-empty查找空文件或空目录

常用执行动作

动作功能描述
-print打印查找到的文件(默认动作)
-ls以ls -l格式显示文件信息
-delete删除查找到的文件
-exec对查找到的文件执行指定命令

实操演示

示例4:按文件名查找

bash
# 在当前目录查找名为test.txt的文件
$ find . -name "test.txt"
./test.txt

# 在/home目录查找所有.txt文件
$ find /home -name "*.txt"
/home/user/document.txt
/home/user/notes.txt

# 查找以.log结尾的文件
$ find /var/log -name "*.log"
/var/log/syslog
/var/log/auth.log

示例5:按文件类型查找

bash
# 查找所有目录
$ find /home -type d
/home
/home/user
/home/user/documents

# 查找所有普通文件
$ find /home -type f
/home/user/document.txt
/home/user/script.sh

# 查找所有符号链接
$ find /usr/bin -type l
/usr/bin/python3 -> python3.9
/usr/bin/java -> /usr/lib/jvm/java-11/bin/java

示例6:按文件大小查找

bash
# 查找大于100MB的文件
$ find / -size +100M 2>/dev/null
/var/log/syslog
/home/user/data.tar.gz

# 查找小于1MB的文件
$ find /home -size -1M
/home/user/config.ini
/home/user/notes.txt

# 查找大小为10MB的文件
$ find / -size 10M 2>/dev/null
/home/user/backup.tar

示例7:按修改时间查找

bash
# 查找7天内修改过的文件
$ find /home -mtime -7
/home/user/document.txt
/home/user/script.sh

# 查找7天前修改过的文件
$ find /home -mtime +7
/home/user/old_data.txt

# 查找正好7天前修改过的文件
$ find /home -mtime 7
/home/user/backup.tar

示例8:按文件所有者查找

bash
# 查找属于root用户的文件
$ find /etc -user root
/etc/passwd
/etc/group

# 查找属于user1用户的文件
$ find /home -user user1
/home/user1/document.txt
/home/user1/script.sh

示例9:按文件权限查找

bash
# 查找权限为777的文件
$ find /etc -perm 777
/etc/config.conf

# 查找所有用户可写的文件
$ find /home -perm /o+w
/home/user/public.txt

# 查找可执行文件
$ find /home -perm /a+x
/home/user/script.sh
/home/user/app

示例10:查找空文件和空目录

bash
# 查找空文件
$ find /home -type f -empty
/home/user/empty.txt

# 查找空目录
$ find /home -type d -empty
/home/user/empty_dir

高级应用

示例11:组合多个查找条件

bash
# 查找大于10MB且以.log结尾的文件
$ find /var/log -name "*.log" -size +10M
/var/log/syslog

# 查找属于root用户且权限为644的文件
$ find /etc -user root -perm 644
/etc/passwd
/etc/group

# 查找7天内修改过的.txt文件
$ find /home -name "*.txt" -mtime -7
/home/user/document.txt

示例12:使用-exec执行命令

bash
# 查找并删除所有.tmp文件
$ find /tmp -name "*.tmp" -delete

# 查找并显示所有.log文件的详细信息
$ find /var/log -name "*.log" -ls
-rw-r--r-- 1 root root 12345 Jan 15 10:00 /var/log/syslog
-rw-r--r-- 1 root root 6789 Jan 15 10:00 /var/log/auth.log

# 查找并复制所有.txt文件到backup目录
$ find /home -name "*.txt" -exec cp {} /backup \;

# 查找并修改文件权限
$ find /home -name "*.sh" -exec chmod +x {} \;

示例13:使用xargs处理大量文件

bash
# 查找并删除所有.log文件
$ find /var/log -name "*.old.log" | xargs rm

# 查找并压缩所有.log文件
$ find /var/log -name "*.log" -mtime +30 | xargs gzip

# 查找并统计文件数量
$ find /home -type f | wc -l
1500

3. 实际应用场景

场景1:查找大文件

bash
# 查找系统中的大文件
$ find / -type f -size +100M 2>/dev/null | head -10
/var/log/syslog
/home/user/data.tar.gz
/opt/software/installer.tar

# 查找并按大小排序
$ find /home -type f -exec ls -lh {} \; | sort -k5 -h | tail -10
-rw-r--r-- 1 user user 500M Jan 15 10:00 /home/user/data.tar.gz
-rw-r--r-- 1 user user 200M Jan 15 10:00 /home/user/backup.tar

场景2:清理临时文件

bash
# 查找并删除7天前的临时文件
$ find /tmp -name "*.tmp" -mtime +7 -delete

# 查找并压缩30天前的日志文件
$ find /var/log -name "*.log" -mtime +30 | xargs gzip

# 查找并删除空目录
$ find /data -type d -empty -delete

场景3:查找特定类型的文件

bash
# 查找所有可执行文件
$ find /home -type f -perm /a+x
/home/user/script.sh
/home/user/app

# 查找所有配置文件
$ find /etc -name "*.conf"
/etc/nginx/nginx.conf
/etc/ssh/sshd_config

# 查找所有图片文件
$ find /home -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \)
/home/user/photo.jpg
/home/user/image.png

场景4:查找并处理文件

bash
# 查找并修改文件权限
$ find /var/www -type f -exec chmod 644 {} \;
$ find /var/www -type d -exec chmod 755 {} \;

# 查找并更改文件所有者
$ find /home/user -user olduser -exec chown newuser:newuser {} \;

# 查找并统计文件数量
$ find /data -type f -name "*.log" | wc -l
250

4. which和find结合使用

示例14:查找命令并确认路径

bash
# 查找命令路径并确认
$ which python
/usr/bin/python

# 查找python相关的所有文件
$ find / -name "python*" 2>/dev/null
/usr/bin/python
/usr/lib/python3
/usr/share/python3

示例15:查找配置文件

bash
# 查找nginx配置文件
$ which nginx
/usr/sbin/nginx

# 查找nginx配置文件
$ find / -name "nginx.conf" 2>/dev/null
/etc/nginx/nginx.conf

命令主要功能核心选项
which查找命令路径-a:显示所有匹配路径
find查找文件和目录-name:按文件名
-type:按文件类型
-size:按文件大小
-mtime:按修改时间
-user:按文件所有者
-perm:按文件权限
-empty:查找空文件或空目录
-exec:执行命令

课程总结

这节课我们学了文件查找的两个命令。

which - 查找命令的路径: which 命令名 - 查看命令在哪,比如which ls

find - 按条件查找文件,功能更强大: find . -name "test.txt" - 按文件名查找 find . -type d - 查找目录 find . -size +100M - 查找大于100MB的文件 find . -mtime -7 - 查找7天内修改过的文件

find支持组合多个条件,用-exec可以对查到的文件执行命令。

课后练习

练习1(基础)

请在Linux终端中执行以下操作:

  • 使用which命令查找ls、grep、cat命令的路径
  • 使用find命令在当前目录查找名为".txt"的文件
  • 使用find命令在home目录查找所有目录

💡 提示:使用通配符*.txt可以匹配所有.txt文件。

练习2(进阶)

请尝试:

  • 使用find命令查找大于10MB的文件
  • 使用find命令查找7天内修改过的文件
  • 使用find命令查找所有以".log"结尾的文件,并统计文件数量

💡 提示:使用+10M表示大于10MB,-7表示7天内。

练习3(拓展)

请尝试:

  • 使用find命令查找并删除所有临时文件(以".tmp"结尾)
  • 使用find命令查找所有可执行文件,并修改权限为755
  • 结合which和find命令,查找python命令的所有相关文件

💡 提示:使用-exec选项可以对查找结果执行命令,如find . -name "*.tmp" -delete

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径