• 文件查找工具:locate、find
  • locate使用
  • find使用
  • rename修改文件名

为了高效提升效率,文件系统中的文件众多,Linux系统一切皆文件的思想,不免有时候忘记某个文件位于哪个文件夹,或具体叫什么名字等,使用ls/cd 等工具一个一个查找比较低效无用,对于内容查找可以使用'三剑客'。

  • locate使用 依赖事先存在的索引库,数据并非实时更新,需要手动update或者cron任务实现周期更新; 特点: 查找速度快、模糊查找、非实时查找 用法: locate [options] pattern.. -b : 只匹配路径的基名 -c : 统计出共有多少个符合的 -r : 正则表达式匹配

  • find使用 实时查找,通过遍历整个跟文件系统查找,比较消耗资源 特点:查找速度略慢、精确查找、实时查找 用法: find [options] [查找起始路径] [查找条件] [处理动作] 查找路径:默认当前路径,指定精确的范围能够提高效率 查找条件:指定查找的标准,文件名、大小、文件类型、从属关系、时间、权限 处理动作:默认为标准输出至屏幕,可以对查找符合条件的文件做处理,如删除、执行某命令。 查找条件:[选项[测试条件]]

    • 测试条件:布尔型结果true 、false 组合测试: -a: 与关系,如何多个条件不加测试,默认为与关系 -o: 或关系 -not | !: 非关系

    • 根据文件名查找 -name “pattern” -iname "pattern" :不区分大小写 -regex "pattern":基于正则表达式查找,匹配是整个路径,而非其名 支持glob通配符:*、?、[]、[^]... 如查找/usr/share/中.jpg结尾文件:

    • 根据从属关系查找 -user username:指定用户文件的属主查找 -group groupname:指定文件的属组查找 -uid UID :指定文件的uid查找 -gid GID :指定文件的gid查找 -nouser :查找没有属主的文件 -nogroup :查找没有属组的文件

    • 根据文件类型查找 -type TYPE f: 普通文件 d: 目录文件 l:符号链接文件 b:块设备 文件 c:字符设备文件 p:管道文件 s:套接字文

    • 根据文件大小查找 -size [+|-] #单位 :单位常用K,M,G #3K:表示精确大小查找,(#-1,#]数学范围表示 +3K:表示大于3K的文件,(#,0-0) -3K:表示小于3K的文件,(0,#)

    • 根据文件时间戳查找,即stat的三个时间戳 以天为单位:类型 [+|-] # -atime :访问时间 -mtime :修改时间 -ctime :改变时间 以分钟为单位: -amin -mmin -cmin 以数轴为例区分【+|-】#

    • 根据文件权限查找 -perm [/|-]mode mode:精确权限查找 /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;9位权限之间存在“或”关系; -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足; 9位权限之间存在“与”关系;

  • 处理动作: -print:标准输出;默认动作; -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息; -delete:删除查找到的文件; -fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中; -ok COMMAND ‘{}’ ; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认; -exec COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令; 注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令; 但是有些命令不能接受过长的参数,此时命令执行会失败; 可以使用:find | xargs COMMAND 如:找到/usr/share/下图片并复制到/tmp下

  • 以上只是查找文件,如何根据内容查找:如查找grub.d/下中文件包含有GRUB2_PASSWORD -r:表示递归查找 -n:显示行号 详细用法查看grep.

  • rename修改文件名用法 也可以使用循环的批量修改,这里涉及只修改后缀名使用cp、mv比较不便;

[root@xt test]# bash cname.sh 
mv: cannot move ‘a’ to ‘a.boy.sh’: Operation not permitted
[root@xt test]# ls
a             file10.boy.sh  file2.boy.sh  file4.boy.sh  file6.boy.sh  file8.boy.sh
cname.boy.sh  file1.boy.sh   file3.boy.sh  file5.boy.sh  file7.boy.sh  file9.boy.sh
[root@xt test]# cat cname.boy.sh 
#!/usr/bin/bash
filename=.boy.sh
dirname="/tmp/test"
cd $dirname || exit 1
for n in $(ls);do 
name=$(echo ${n} | awk -F '.' '{print $1}')
mv $n ${name}${filename}
done
[root@xt test]#