文件查找
locate
基于/var/lib/mlocate.db数据库查找,更新方式updatedb,查找速度快,模糊查找,非实时查找,搜索的是文件的全路径,不仅仅是文件名,可能只搜索用户具备读取和执行权限的目录,常用选项:
- -i:不区分大小写搜索
- -n #:只列举前#个匹配项目
- -r:使用正则表达式
[root@centos6 ~]# locate conf
[root@centos6 ~]# locate -r "\.conf"
find
查找速度慢,精确查找,实时查找,可能只搜索用户具备读取和执行权限的目录
语法:find [options] [查找路径] [查找条件] [处理动作]
- 查找路径:指定具体目标路径,默认为当前目录
- 查找条件:指定查找标准,可以文件名,大小,类型,权限等标准进行,默认为查找目标路径下的所有文件
- 处理动作:对符合条件的文件做操作,默认输出至终端
查找条件
指定搜索层级
- -maxdepth level:指定最大搜索目录深度,指定目录为第一级
- -mindepth level:指定最小搜索目录深度
[root@centos6 app]# tree
.
└── c
└── 2
└── 3
└── 4
└── 5
5 directories, 0 files
[root@centos6 app]# find -maxdepth 5
.
./.a.sh.swp
./c
./c/2
./c/2/3
./c/2/3/4
./c/2/3/4/5
[root@centos6 app]# find -mindepth 5
./c/2/3/4/5
指定文件名和inode
- -name "filename":支持使用文件通配符
- -iname "filename":不区分字母大小写
- -inum #:按inode号查找
- -samefile filename:相同inode号的文件
- -links #:链接数为#的文件
- -regextype posix-extended -regex "pattern":以pattern匹配整个文件路径字符串,不仅仅是文件名称,注意和正则匹配进行区分(-regextype posix-extended表示指正则表达式类型为扩展正则)
[root@centos6 app]# find /etc/ -regextype posix-basic -regex "\.conf$"
[root@centos6 app]# find /etc/ -regextype posix-basic -regex ".*\.conf$"
/etc/libreport/report_event.conf
......
/etc/java/java.conf
指定属主、属组
- -user username:查找属主为指定用户的文件
- -group grpname:查找属组为指定组名的文件
- -uid UID:查找属主为指定UID号的文件
- gid GID:查找属组为指定GID号的文件
- -nouser:查找没有属主的文件
- -nogroup:查找没有属组的文件
有些文件是以指定属主和属组创建的,当删除属主的用户或者属组的组时,这些文件就没有属主或者属组了,这时就需要用到上面的-nouser/-nogroup
指定文件类型
- -type f:普通文件
- -type d:目录文件
- -type l:符号链接文件
- -type b:块设备文件
- -type c:字符设备文件
- -type p:管道文件
- -type s:套接字文件
指定组合条件
- -a:and 且
- -o:or 或
- !/-not:非
德·摩根定律
(非A) 或 (非B) = 非(A且B)
(非A) 且 (非B) = 非(A或B)
指定两个查找条件未添加指定组合关系时,默认为-a
[root@centos6 app]# ll
total 4
-rw-r--r--. 1 fanjie root 0 May 30 20:30 1
-rw-r--r--. 1 root fanjie 0 May 30 20:30 2
-rw-r--r--. 1 fanjie fanjie 0 May 30 20:30 3
[root@centos6 app]# find -user fanjie -group joe
find: `joe' is not the name of an existing group
[root@centos6 app]# find -user fanjie -group fanjie
./3
[root@centos6 app]# find -not \( -user fanjie -a -group fanjie \)
.
./2
./1
[root@centos6 app]# find -not \( -user fanjie -o -group fanjie \)
.
指定排除目录
- -path "dirname" -a -prune:排除指定目录,不查找此目录
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其它所有.conf后缀的文件
[root@centos6 app]# find /etc/ \( -path "/etc/sane.d/" -o -path "/etc/fonts/" \) -a -prune -o -name "*.conf"
指定文件大小
- -size #unit:(#-1,#]
- 如:6k 表示(5k,6k]
- -size +#unit:(#,∞)
- 如:+6k 表示(6k,∞)
- -size -#unit:[0,#-1]
- 如:-6k 表示[0,5k]
指定时间
- 以“天”为单位:-atime/-mtime/ctime
- -atime #:[#,#+1)
- -atime +#:[#+1,∞]
- -atime -#:[0,#)
- 以“分钟”为单位:-amin/-mmin/-cmin
- -amin #:[#,#+1)
- -amin +#:[#+1,∞]
- -amin -#:[0,#)
指定权限
- -perm mode:精确权限查找
- -perm /mode:各权限位之间为逻辑或的关系,各权限位只要有一位匹配即可
- -perm -mode:各权限位之间为逻辑与的管理,各权限位必须同时匹配才可以
- 0表示不关注,7表示满权限
- 查找当前目录下,其他人有写权限的文件
[root@centos6 app]# find -perm -002
处理动作
- -print:默认的处理动作,将结果输出至终端
- -ls:类似于对查找到的文件执行“ls -l”
- -delete:删除查找到的文件
- -fls file:将查到文件的长格式信息保存至指定文件中
- -ok command {} ;:对查到的文件执行指定命令,会交互确认,注意反斜线后的封号
- -exec command {} ;:对查到的文件执行指定命令,不交互确认,注意反斜线后的封号
- {}:用于引用查找到的文件名称自身
- 备份当前目录的配置文件,并添加.orig后缀
[root@centos7 app]# find -name “*.conf” -exec cp {} {}.orig \;
xargs
由于find会将查到的内容,一次性全部传递给后面的命令,但是很多命令不支持|来传递参数,而日常工作中很有必要,所有就有了xargs,先读入stdin的数据,然后以空格或回车分隔依次传给后面的命令
注意:文件名或其他意义的名词内含有空格符的情况
有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
[root@centos7 app]# ll
total 0
-rw-r--r--. 1 root root 0 May 31 09:52 1
drwxr-xr-x. 2 root root 6 May 31 09:52 a
[root@centos7 app]# ls * | rm -rf
[root@centos7 app]# ll
total 0
-rw-r--r--. 1 root root 0 May 31 09:52 1
drwxr-xr-x. 2 root root 6 May 31 09:52 a
[root@centos7 app]# ls * | xargs rm -rf
[root@centos7 app]# ll
total 0
drwxr-xr-x. 2 root root 6 May 31 09:52 a
[root@centos7 app]# ls -d * | xargs rm -rf
[root@centos7 app]# ll
total 0
[root@centos7 app]# find /sbin/ -perm +700 | ls -l
total 0
find: warning: you are using `-perm +MODE'. The interpretation of `-perm +omode' changed in findutils-4.5.11. The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'.
[root@centos7 app]# find /sbin/ -perm +700 | xargs ls -l
find: warning: you are using `-perm +MODE'. The interpretation of `-perm +omode' changed in findutils-4.5.11. The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'.
-rwx------. 1 root root 881168 Apr 10 16:24 /sbin/build-locale-archive
-rwx------. 1 root root 790576 Apr 10 16:24 /sbin/glibc_post_upgrade.x86_64
-rwx------. 1 root root 139224 Apr 11 08:10 /sbin/iprdbg
-rwx------. 1 root root 36272 Apr 11 11:22 /sbin/unix_update
压缩和解压缩
compress
compress常用选项:
- -d:解压缩,相当好与uncompress
- -c:结果输出至当前终端,不删除原文件
- -v:显示详情
uncompress:解压缩
zcat file.Z > file
gzip
gzip常用选项:
- -d:解压缩,相当于gunzip
- -c:将压缩的结果输出至标准输出
- 注意-c选项配合重定向的时候文件权限可能会发生改变
- -v:显示详情
- -#:1-9,指定压缩比,值越大压缩比越大
gunzip:解压缩
zcat:不显式解压缩的情况下查看文件内容
[root@centos7 app]# ll
total 4
-rw-r--r--. 1 root root 969 May 31 10:31 passwd.gz
[root@centos7 app]# gzip -d -c passwd.gz > a
[root@centos7 app]# ll
total 8
-rw-r--r--. 1 root root 2517 May 31 11:04 a
-rw-r--r--. 1 root root 969 May 31 10:31 passwd.gz
bzip2
bzip常用选项:
- -k:keep,保留源文件
- -d:解压缩
- -c:将压缩的结果输出至标准输出
- -v:显示详情
- -#:1-9,压缩比,默认为9
bunzip2:解压缩
bzcat:不显式解压缩的前提下查看文件内容
xz
xz常用选项:
- -k:keep,保留原文件
- -d:解压缩
- -c:将压缩的结果输出至标准输出
- -v:显示详情
- -#:1-9,压缩比,默认为6
unxz:解压缩
xzcat:不显式解压缩的前提下查看文件
zip
zip -r 压缩包名 源文件:将源文件压缩成指定名称的文件
unzip:解压缩
cat /var/log/messages | zip messages -
unzip -p:不显式解压缩的前提下查看文件
打包工具
tar
- -c:创建包
- -v:详细过程
- -f:指定包名
- 这是历史的产物,最初tar用来将文件打包到磁带机,然后要用的时候从磁带机还原出来。后来硬盘空间大了,开始直接以文件的形式备份到硬盘,所以才有了 -f 这个选项。
- 可以和选项一起并用,也可以单独一个选项
- tar -cvf test.tar a b c
- tar -cv a b c -f test.tar
- -t:查看包中的文件
- -r:追加文件,不支持对压缩过的包进行追加
- --delete:删除包中指定文件
- -x:解出包中所有文件
- 也可以解出包中的指定文件
- 配合-C解压到指定目录,默认为当前目录
- -j:通过bzip2进行压缩或解压缩,此时包名后缀最好是.tar.bz2
- -z:通过gzip进行压缩或解压缩,此时包名后缀最好是.tar.gz
- -J:通过xz进行压缩或解压缩,此时包名后缀最好是.tar.xz
- -T:指定输入文件,配合-X排除指定文件
分割tar文件
split -b size -d tar-file-name prefix-name
split -b 1M -d test.tar.bz2 test.parts
合并tar文件
cat test.parts* > test.tar.bz2
cpio
通过重定向的方式对文件进行打包备份,还原恢复,可以解压“.cpio”和“.tar”结尾的文件
cpio [选项] > 文件名或设备名:打包
cpio [选项] < 文件名或设备名:解压
常用选项:
- -o:将文件打包到指定包
- -i:解包
- cpio -idv < find.cpio
- cat find.cpio | cpio -idv
- -t:查看包文件
- -v:详细过程
- -d:解包生成目录,因为包中有多级目录,解压是不加-d,无法自动创建,就会报错
- -c:一种较新的存储方式
将etc目录备份,使用find命令注意路径问题,不然解压时会出问题
[root@centos7 etc]# find |cpio -ov > /app/etc.cpio
./dconf/db/ibus.d
......
./dconf/db/ibus.d/00-upstream-settings
[root@centos7 etc]# find /etc/ |cpio -ov > /app/etc.cpio
/etc/ksmtuned.conf.orig
......
/etc/fprintd.conf.orig
练习
-
查找/var目录下属主为root,且属组为mail的所有文件
[root@centos7 etc]# find /var/ -user "root" -a -group "mail"
-
查找/var目录下不属于root、lp、gdm的所有文件
[root@centos7 etc]# find /var -not \( -user "root" -o -user "lp" -o -user "gdm" \)
-
查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 -not \( -user root -o -user postfix \)
-
查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
[root@centos7 ~]# find / \( -nouser -o -nogroup \) -atime -7
-
查找/etc目录下大于1M且类型为普通文件的所有文件
[root@centos7 ~]# find /etc/ -size +1M -type f
-
查找/etc目录下所有用户都没有写权限的文件
find /etc/ -not -perm /222
-
查找/etc目录下至少有一类用户没有执行权限的文件
[root@centos6 app]# find /etc/ -not -perm -111
-
查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
[root@centos6 app]# find /etc/init.d/ -perm -113