which [选项] [命令]
-a
:显示所有匹配的可执行文件路径。默认情况下,which
只显示第一个匹配项。--skip-alias
:跳过别名,直接显示实际命令的路径。-V
或 --version
:显示 which
命令的版本信息。which java
这条命令将返回 java
命令的完整路径
如果使用which命令返回,证明可能文件有同名加上-a参数即可
shell built-in command
which man java python
这条命令会分别显示 man
, java
, 和 python
命令的路径。
-a
选项来显示所有副本的位置。which -a ls
which
会显示别名的定义。which ll
也可以使用
type ll
--skip-alias
选项可以跳过别名,直接获取命令的实际路径。which --skip-alias ll
如果不能使用,可以先
which ll 或者 type ll
得到别名命令来源,这里是ls -l
之后
which -a ls 即可
which
自身的位置which -a which
这条命令显示 which
命令本身的路径。
which
命令只能用于查找可执行文件,对于其他类型的文件(如文档或源代码文件),应该使用 whereis
或 find
命令。which
没有找到指定的命令,那么它将不会有任何输出,这表示该命令不在 PATH
环境变量指定的任何目录中。which
的搜索结果受到 PATH
环境变量的影响,不同的用户可能会有不同的 PATH
设置,因此即使是相同的命令,在不同的用户环境下也可能得到不同的搜索结果。通过这些基本信息,你应该能够有效地使用 which
命令来查找Linux系统中命令的具体位置。
locate [选项] [模式]
wh
-b
:仅匹配基础文件名(即不包括路径)。-c
:仅显示找到的文件数量。-i
:忽略大小写。-n <数目>
:最多显示指定数量的匹配项。-P
或 --no-check-existing
:不检查文件是否存在。-r
:使用正则表达式进行匹配。-S
:显示数据库统计信息。-u
:更新数据库(通常由 updatedb
命令完成)。-0
:以空字符分隔结果,适合用于脚本处理。locate whoami.exe
查找whoami.exe的位置
locate Whoami.exe
这条命令会查找包含 Whoami.exe
的文件,忽略大小写。
locate -n 5 example
这条命令最多显示 5 个匹配项。
locate -r -n 5 '/home/kali.*\.txt$'
locate -b -n 5 user
这条命令会查找基础文件名为 user
的文件,不包括路径。
locate -c ls
这条命令会显示找到的 ls
文件的数量。
locate
命令依赖于一个预先构建的数据库,该数据库通常由 updatedb
命令定期更新。你可以手动运行 updatedb
来更新数据库。
sudo updatedb
locate
命令的速度优势来自于预构建的数据库。如果文件系统发生了变化,而数据库没有及时更新,locate
的结果可能不准确。因此,建议定期运行 updatedb
。updatedb
通常需要 root 权限来访问所有目录和文件。locate
很快,但如果文件系统非常大,updatedb
的运行时间可能会较长。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
:删除找到的文件。find ~ -name "flag*"
find /home/user -iname "example.txt"
find /home/user -path "*/logs/*.log"
find -type d
find ~ -size +100M
find ~ -mmin -30
find ~ -name "*.txt" -mtime 10 -exec cat {} \;
~
:指定要搜索的目录路径为家目录。-name "*.txt"
:按文件名查找,匹配所有扩展名为 .txt
的文件。
*
:通配符,匹配任意字符序列。*.txt
:匹配所有以 .txt
结尾的文件。-exec cat {} \;
:对找到的每个文件执行 cat
命令。
{}
:占位符,表示当前找到的文件路径。\;
:表示 -exec
命令的结束。find -name "*.txt" -delete
find ~ -mtime 2 -ls | sort -k9 -k10 | more
find ~ -mtime 2 -ls
:
~
:表示当前用户的家目录。-mtime 2
:查找恰好在 2 天前被修改的文件。-ls
:显示找到的文件的详细信息,输出格式类似于 ls -l
,包括文件权限、链接数、所有者、组、文件大小、修改日期和时间、文件路径等。sort -k9 -k10
:
sort
:对输入进行排序。-k9
:按第 9 列排序,一般是日期的那一列-k10
:按第 10 列排序,一般是时间的那一列more
:
more
:分页显示输出,方便查看大量输出内容。find ~ -type f -iname '*.sh' -mmin -30 -ls
-type f
:
-iname '*.sh'
:
*
,并且不区分大小写。*.sh
:匹配所有以 .sh
结尾的文件。-iname
:不区分大小写。-mmin -30
:
-30
:表示在过去 30 分钟内被修改的文件。-ls
:
ls -l
命令的输出,包括文件权限、链接数、所有者、组、文件大小、修改日期和时间、文件路径等。find -name '*.svn' -exec rm -rf {} \
find .
:
.
)开始搜索。-name '.svn'
:
.svn
的目录。-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
限制搜索深度。