find
find
搜寻文件或目录:
$find ./ -name "core*" | xargs file
查找目标文件夹中是否有obj文件:
# 注意单引号会阻止扩展,双引号不会。
$find ./ -name '*.o'
递归当前目录及子目录删除所有.o文件:
$find ./ -name "*.o" -exec rm {} \;
查找txt和pdf文件:
find . \( -name "*.txt" -o -name "*.pdf" \) -print
正则方式查找.txt和pdf:
# -iregex: 忽略大小写的正则
find . -regex ".*\(\.txt\|\.pdf\)$"
find . -regex '.*\.(py\|sh\)$'
find . -iregex '.*\(\.py\|\.sh\)$'
否定参数 ,查找所有非txt文本:
find . ! -name "*.txt" -print
指定搜索深度,打印出当前目录的文件(深度为1):
find . -maxdepth 1 -type f
find . -mindepth 2 -maxdepth 5 -name "f*" -print
按类型搜索
#只列出所有目录
find . -type d -print
-type ==> f 文件 / l 符号链接 / d 目录
find支持的文件检索类型可以区分普通文件和符号链接、目录等,但是二进制文件和文本文件无法直接通过find的类型区分出来;
按时间搜索
* -atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
* -mtime 修改时间 (内容被修改)
* -ctime 变化时间 (元数据或权限变化)
最近第7天被访问过的所有文件:
find . -atime 7 -type f -print
最近7天内被访问过的所有文件:
find . -atime -7 -type f -print
查询7天前被访问过的所有文件:
find . -atime +7 -type f -print
按分
- 访问时间(-amin)
- 修改时间(-mmin)
- 变化时间(-cmin)
find . -type f -amin +7 -print 打印出7分钟之前访问的所有文件。
find . -type f -newer file.txt -print 找出比file.txt修改时间更近的所有文件。
查找本地目录下的所有二进制文件:
ls -lrt | awk '{print $9}'|xargs file|grep ELF| awk '{print $1}'|tr -d ':'
file命令可以检查文件具体类型(二进制或文本):
$file redis-cli # 二进制文件
redis-cli: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$file redis.pid # 文本文件
redis.pid: ASCII text
按大小搜索:
# b 块(512字节) C 字节 w 字(2字节) k 千字节(1024字节) M 兆字节(1024K字节) G 吉字节(1024M字节)
find . -type f -size +2k 大于2KB的文件
find . -type f -size -2k 小于2KB的文件
find . -type f -size 2k 大小等于2KB的文件
# 搜索空文件
find . -size -empty
删除当前目录下所有的swp文件:
find . -type f -name "*.swp" -delete
另一种语法:
find . type f -name "*.swp" | xargs rm
将当前目录下的所有权变更为weber:
find . -type f -user root -exec chown weber {} \;
注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;
将十天前的文件复制到OLD目录中
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
结合多个命令
如果需要后续执行多个命令,可以将多个命令写成一个脚本。然后 -exec 调用时执行脚本即可: 注意该命令结尾的\;
必须对分号转义,否则shell将其视为find命令的结束,而非chown命令的结束。
-exec ./commands.sh {} \;
为每个匹配到的文件调命令可是不小的开销。可以用加号(+)作为命令结尾。这样find会生成一份包含所有搜索结果的列表,然后将其作为指定命令的参数,一次性执行。
find . -type f -name '*.c' -exec cat {} \;>all_c_files.txt
find . -type f -name '*.c' -exec cat {} > all_c_files.txt \;
fine . -type f -name '*.c' -exec cat {} >all_c_files.txt +
显示目录/文件名并传递给xargs
# -print 使用换行符输出每个文件或目录名
# -print0 使用空字符'\0'来分割
find . -type f -print0 | xargs -0 ls -l
统计源代码目录中所有c程序文件的行数
find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc –l
在当前目录中找到所有php文件中包含eval的文件.
find . -name '*.php' -exec grep -l 'eval' {} \;
忽略大小写
find . -iname "example*" -print
逻辑操作符
-a和-and选项可以执行逻辑与操作,-o和-or选项可以执行逻辑或操作
find . \( -name '*.txt' -o -name '*.pdf' \) -print
限制查找路径
-regex选项和-path类似,不过前置是基于正则表达式来匹配文件。
find /home/users -path '*/slynux/*' -name '*.txt' –print
按权限查找
find . -type f -perm 644 -print //找具有可执行权限的所有文件
按用户查找
find . -type f -user weber -print// 找用户weber所拥有的文件
locate
find是实时查找,如果需要更快的查询,可试试locate;locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库:
$updatedb
寻找包含有string的路径:
$locate string
查找目录中的大文件
How To: Linux Find Large Files in a Directory
查找目录
find ./ -type d -iname "*nuxt*"
反转操作
# 找到不包含bash的文件
find / -not -iname *bash*
根据权限查找
# 匹配644权限的
-perm 644
-perm u=rw,g=r,o=r
# 匹配至少有644权限的
-perm -644
-perm -u=rw,g=r,o=r
# ‘/’ 可以理解为逻辑或
-perm /644
-perm /u=rw,g=r,o=r
# -perm -a+r:这部分命令指定文件应该对所有用户(所有者、组和其他用户)具有读取权限。
# -perm /a+w:这部分指定文件应该对任何用户(所有者、组或其他用户)具有写入权限。
# \! -perm /a+x:这部分是否定 (\!),指定文件不应该对任何用户(所有者、组或其他用户)具有执行权限。
find / -perm -a+r -perm /a+w \! -perm /a+x
更改当前目录及其子目录下所有文件的访问和修改时间为当前时间
find . -type f -exec touch {} \;
替换文件内容
find . -type f -name "*.md" -exec sed -i '' 's/```SQL/```sql/g' {} +
匹配文字并在匹配行最后添加内容。
find . -type f -name "*.md" -exec sed -i '' '/\!\[\]/s/$/{style="max-height:1200px;"}/g' {} +