Bootstrap

linux命令详解,搜索文件类

搜索文件

which

which 命令是Linux系统中用于查找并显示给定命令的绝对路径的一个工具。它通过检查环境变量 PATH 中列出的目录来确定可执行文件的位置。这对于了解某个命令是否已安装以及其具体位置非常有用。下面是关于 which 命令的一些重要细节:

基本语法
which [选项] [命令]
参数
  • -a:显示所有匹配的可执行文件路径。默认情况下,which 只显示第一个匹配项。
  • --skip-alias:跳过别名,直接显示实际命令的路径。
  • -V--version:显示 which 命令的版本信息。
使用示例
  1. 查找单个命令的位置
which java

这条命令将返回 java 命令的完整路径
image.png

如果使用which命令返回,证明可能文件有同名加上-a参数即可

shell built-in command

image.png

  1. 查找多个命令的位置
which man java python

这条命令会分别显示 man, java, 和 python 命令的路径。
image.png

  1. 显示所有匹配的路径
    如果一个命令在多个路径中有副本,可以使用 -a 选项来显示所有副本的位置。
which -a ls

image.png

  1. 查找别名的位置
    如果你为某个命令设置了别名,which 会显示别名的定义。
which ll

也可以使用
type ll

image.png

  1. 查找并忽略别名
    使用 --skip-alias 选项可以跳过别名,直接获取命令的实际路径。
which --skip-alias ll

如果不能使用,可以先

which ll 或者 type ll 
得到别名命令来源,这里是ls -l
之后
which -a ls 即可
  1. 查看 which 自身的位置
    which  -a which
    

这条命令显示 which 命令本身的路径。
image.png

注意事项
  • which 命令只能用于查找可执行文件,对于其他类型的文件(如文档或源代码文件),应该使用 whereisfind 命令。
  • 如果 which 没有找到指定的命令,那么它将不会有任何输出,这表示该命令不在 PATH 环境变量指定的任何目录中。
  • which 的搜索结果受到 PATH 环境变量的影响,不同的用户可能会有不同的 PATH 设置,因此即使是相同的命令,在不同的用户环境下也可能得到不同的搜索结果。

通过这些基本信息,你应该能够有效地使用 which 命令来查找Linux系统中命令的具体位置。

locate (local.db)

locate 命令是 Linux 系统中用于快速查找文件和目录的工具。它通过搜索预先构建的数据库来查找文件,而不是实时搜索文件系统。这使得 locate 命令比 find 命令更快,但前提是数据库必须是最新的。

基本语法
locate [选项] [模式]
选项

wh

  • -b:仅匹配基础文件名(即不包括路径)。
  • -c:仅显示找到的文件数量。
  • -i:忽略大小写。
  • -n <数目>:最多显示指定数量的匹配项。
  • -P--no-check-existing:不检查文件是否存在。
  • -r:使用正则表达式进行匹配。
  • -S:显示数据库统计信息。
  • -u:更新数据库(通常由 updatedb 命令完成)。
  • -0:以空字符分隔结果,适合用于脚本处理。
使用示例
  1. 基本使用
locate whoami.exe

查找whoami.exe的位置
image.png

  1. 忽略大小写
locate Whoami.exe

这条命令会查找包含 Whoami.exe 的文件,忽略大小写。
image.png

  1. 限制结果数量
locate -n 5 example

这条命令最多显示 5 个匹配项。
image.png

  1. 使用正则表达式
locate -r -n 5 '/home/kali.*\.txt$'

这条命令会查找 /home 目录下所有以 .txt 结尾的文件。
在这里插入图片描述

  1. 仅匹配基础文件名
locate -b -n 5 user 

这条命令会查找基础文件名为 user 的文件,不包括路径。
image.png

  1. 显示找到的文件数量
locate -c ls

这条命令会显示找到的 ls 文件的数量。
image.png

更新数据库

locate 命令依赖于一个预先构建的数据库,该数据库通常由 updatedb 命令定期更新。你可以手动运行 updatedb 来更新数据库。

sudo updatedb
注意事项
  • 数据库更新locate 命令的速度优势来自于预构建的数据库。如果文件系统发生了变化,而数据库没有及时更新,locate 的结果可能不准确。因此,建议定期运行 updatedb
  • 权限问题updatedb 通常需要 root 权限来访问所有目录和文件。
  • 性能:虽然 locate 很快,但如果文件系统非常大,updatedb 的运行时间可能会较长。

find

find 命令是 Linux 系统中一个非常强大且灵活的文件查找工具。它可以基于多种条件(如文件名、文件类型、修改时间、文件大小等)来查找文件和目录。下面是对 find 命令的详细解释,包括其基本语法、常用选项和一些实用示例。

基本语法
find [路径] [表达式]
文件名和路径
  • -name <pattern>:按文件名查找,支持通配符 *?[ ]
  • -iname <pattern>:按文件名查找,忽略大小写。
  • -path <pattern>:按路径查找,支持通配符。
  • -ipath <pattern>:按路径查找,忽略大小写。
文件类型
  • -type <type>:按文件类型查找。
    • f:普通文件
    • d:目录
    • l:符号链接
    • c:字符设备
    • b:块设备
    • p:命名管道(FIFO)
    • s:套接字
文件大小
  • -size <size>:按文件大小查找。
    • +n:大于 n 字节
    • -n:小于 n 字节
    • n:恰好 n 字节
    • nK:n 千字节
    • nM:n 兆字节
    • nG:n 吉字节
修改时间
-mtime 以天为单位
-mmin 以分钟为单位
参数都是一样的,这里以-mtime举例
  • -mtime <n>:按文件修改时间查找。
    • +n:n 天前修改过的文件
    • -n:n 天内修改过的文件
    • n:恰好 n 天前修改过的文件
  • -atime <n>:按文件访问时间查找。
  • -ctime <n>:按文件状态改变时间查找。
执行操作
  • -exec <command> {} \;:对找到的每个文件执行命令。
  • -ok <command> {} \;:类似 -exec,但会提示用户确认。
  • -delete:删除找到的文件。
实用示例
  1. 按文件名查找
find ~ -name "flag*"

这条命令会在家目录及其子目录中查找以flag开头的文件
image.png

  1. 忽略大小写查找
find /home/user -iname "example.txt"

这条命令会在家目录及其子目录中查找以flag开头的文件,且忽略大小写
在这里插入图片描述

  1. 按路径查找
find /home/user -path "*/logs/*.log"

这条命令会在家目录及其子目录中查找路径中包含 logs 且文件名以 .log 结尾的文件。
image.png

  1. 按文件类型查找
find  -type d

这条命令会在当前目录及其子目录中查找所有的目录
image.png

  1. 按文件大小查找
find ~ -size +100M

这条命令会在家目录及其子目录中查找大于 100MB 的文件。
image.png

  1. 按修改时间查找
find ~ -mmin -30

查找家目录及其子目录中在过去 30 分钟内被修改过的所有文件和目录。
在这里插入图片描述

  1. 执行命令
find ~ -name  "*.txt" -mtime 10 -exec cat {} \;

  • ~:指定要搜索的目录路径为家目录。
  • -name "*.txt":按文件名查找,匹配所有扩展名为 .txt 的文件。
    • *:通配符,匹配任意字符序列。
    • *.txt:匹配所有以 .txt 结尾的文件。
  • -exec cat {} \;:对找到的每个文件执行 cat 命令。
    • {}:占位符,表示当前找到的文件路径。
    • \;:表示 -exec 命令的结束。
      image.png
  1. 删除文件
find -name "*.txt" -delete

在当前目录及其子目录中查找所有 .txt 文件并删除它们。

组合使用
find ~ -mtime 2 -ls | sort -k9 -k10 | more
  1. find ~ -mtime 2 -ls
    • ~:表示当前用户的家目录。
    • -mtime 2:查找恰好在 2 天前被修改的文件。
    • -ls:显示找到的文件的详细信息,输出格式类似于 ls -l,包括文件权限、链接数、所有者、组、文件大小、修改日期和时间、文件路径等。
  2. sort -k9 -k10
    • sort:对输入进行排序。
    • -k9:按第 9 列排序,一般是日期的那一列
    • -k10:按第 10 列排序,一般是时间的那一列
    • 这两个选项结合起来可以按文件名进行排序。
      image.png
  3. more
    • more:分页显示输出,方便查看大量输出内容。
      image.png
find ~ -type f -iname '*.sh' -mmin -30 -ls
  1. -type f
    • 查找普通文件(不包括目录、符号链接等)。
  2. -iname '*.sh'
    • 按文件名查找,支持通配符 *,并且不区分大小写。
    • *.sh:匹配所有以 .sh 结尾的文件。
    • -iname:不区分大小写。
  3. -mmin -30
    • 按分钟数查找文件的最后修改时间。
    • -30:表示在过去 30 分钟内被修改的文件。
  4. -ls
    • 显示找到的文件的详细信息,类似于 ls -l 命令的输出,包括文件权限、链接数、所有者、组、文件大小、修改日期和时间、文件路径等。
      image.png
find -name '*.svn' -exec rm -rf {} \
  1. find .
    • 从当前目录(.)开始搜索。
  2. -name '.svn'
    • 查找所有名为 .svn 的目录。
  3. -exec rm -rf {} \;
    • 对每个找到的 .svn 目录执行 rm -rf 命令,递归删除这些目录及其内容。
find / -user root -type f -perm -o=w -name '*.sh' 2>/dev/null
注意事项
  • 性能find 命令会实时搜索文件系统,因此在大型文件系统中可能会比较慢。
  • 权限find 命令可能无法访问某些受权限保护的目录或文件,可以使用 sudo 提升权限。
  • 递归find 默认会递归搜索子目录,可以在路径后加上 -maxdepth 1 限制搜索深度。
;