在文件系统上查找符合条件的文件
文件查找:locate,find
工作特点:
格式:
Usage: locate [OPTION]... [PATTERN]...
常用选项:
-i :不区分大小写的搜索
-n N :只列举前N个匹配项目
-r :使用基本正则表达式
范例:
# 搜索名称或者路径中包含"conf"的文件
locate conf
# 使用Regex正则表达式搜索以".conf"结尾的文件
locate -r "\.conf$"
范例:locatedb创建数据库
~ yum install -y mlocate
~ locate conf
locate: can not stat o "/var /lib/mlocate/locate.db" : No such file or directory
~ updatedb
~ ls -l /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 9464071 May 22 12:51 /var/lib/mlocate/mlocate.db
~ locate -n 3 conf
/boot/config-3.10.0-1160.el7.x86_64
/boot/grub/grub.conf
/boot/grub2/i386-pc/configfile.mod
范例:文件新创建和删除,无法马上更新 locatedb 数据库
~ touch test.log
~ locate test.log
locate: can not stat o "/var /lib/mlocate/locate.db" : No such file or directory
~ updatedb
~ locate test.log
/root/test.log
~ rm -rf test.log
~ locate test.log
/root/test.log
范例:
~ locate -n 10 -ir '\.CONF$'
/boot/grub/grub.conf
/data/etc2022-05-17/asound.conf
/data/etc2022-05-17/chrony.conf
/data/etc2022-05-17/dracut.conf
/data/etc2022-05-17/e2fsck.conf
/data/etc2022-05-17/grub.conf
/data/etc2022-05-17/host.conf
/data/etc2022-05-17/idmapd.conf
/data/etc2022-05-17/kdump.conf
/data/etc2022-05-17/krb5.conf
find 是实时查找工具,通过遍历指定路径完成文件查找(默认递归,包含隐藏文件的查找)
工作特点:
格式:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
-maxdepth level:最大搜索目录深度,指定目录下的文件为第一级
-mindepth level:最小搜索目录深度
范例:
find /etc -maxdepth 2 -mindepth 2
-depth -d,影响显示次序。
-d # hwarning: the -d option is deprecated; please use -depth instead,because the latter is a POSIX-compliant feature
默认先处理目录,后处理文件
范例:
~ tree /data/test/
/data/test/
├── f1.txt
├── f2.txt
└── test2
└── test3
├── f3.txt
└── f4.txt
2 directories, 4 files
~ find /data/test/
/data/test/
/data/test/f1.txt
/data/test/f2.txt
/data/test/test2
/data/test/test2/test3
/data/test/test2/test3/f3.txt
/data/test/test2/test3/f4.txt
~ find /data/test/ -depth
/data/test/f1.txt
/data/test/f2.txt
/data/test/test2/test3/f3.txt
/data/test/test2/test3/f4.txt
/data/test/test2/test3
/data/test/test2
/data/test/
范例:
~ find -name snow.png
~ find -iname snow.png
~ find . -name "*.txt"
~ find /var -name "log*"
~ find . -regex ".*\.txt$"
./f1.txt
./f2.txt
./test2/test3/f3.txt
./test2/test3/f4.txt
范例:
~ find /home -user zzw -ls
67112643 0 drwx------ 2 zzw zzw 62 May 15 17:59 /home/zzw
67112644 4 -rw-r--r-- 1 zzw zzw 18 Apr 1 2020 /home/zzw/.bash_logout
67112645 4 -rw-r--r-- 1 zzw zzw 193 Apr 1 2020 /home/zzw/.bash_profile
67112646 4 -rw-r--r-- 1 zzw zzw 231 Apr 1 2020 /home/zzw/.bashrc
~ find / -nouser -ls
~ find / -nogroup -ls
-type TYPE
TYPE 可以是以下形式:
范例:
~ find /etc -type d -ls
~ find /etc -type f -ls
-empty
范例:
~ find /data/test/ -type d -empty
~ find /data/test/ -empty -ls
与:-a,默认多个条件是与关系
或:-o
非:-not !
范例:
~ find /etc/ -type d -o -type l | wc -l
768
~ find /etc/ -type d -o -type l -ls | wc -l # ( find /etc/ -type d -o -type l -a -ls | wc -l )
137
~ find /etc/ \( -type d -o -type l \) -ls | wc -l
768
德-摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
范例:
find -user joe -group joe
find -user joe -not -group joe
find -user joe -o -user jane
# 搜索文件和目录所有者不是joe并且也不是jane
find -not \( -user joe -o -user jane \)
find / -user joe -o -uid 500
范例:
# 查找文件类型不是目录并且不为空的文件和目录
~ find ! \( -type d -a -empty \) | wc -l
~ find ! -type d -o ! -empty | wc -l
~ find /home/ ! -user wang ! -user mage -ls
~ find ! \( -user wang -o -user mage \)
~ find ! -user wang -a ! -user mage
# 找出/tmp 目录下,属主不是root,并且文件名不以f开头的文件
find /tmp ( -not -user root -a -not -name "-f" ) -ls
find /tmp -not ( -user root -o -name "-f" ) -ls
范例:
#查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
# /etc/sane.d 后面不能出现 / 即:/etc/sane.d/
find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"
#查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"
# 排除/proc和/sys目录
find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1
-size [+|-]#UNIT # 常用单位:k,M,G,c(byte),注意大小写敏感
范例:
# 搜索1k范围是在不包含0字节但是大于0字节,小于等于1字节的范围
~ find /data/test/ -size 1k -ls
# 搜索2k范围是在不包含1024字节但是大于1024,小于等于2048的范围
~ find /data/test/ -size 2k -ls
# 搜索0字节到5k的范围
~ find /data/test/ -size -6k -ls
# 搜索大于2k但是不包含2k,到无穷大
~ find /data/test/ -size +2k -ls
~ find / -size +10G
~ ls -lh /proc/kcore
~ du -sh /proc/kcore
以“天”为单位
以“分钟”为单位
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从CentOS 7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0: 表示不关注
说明:
范例:
~ chmod 600 f1.txt
~ find . -type f -perm 600 -ls
67268584 0 -rw------- 1 root root 0 May 22 13:12 ./f1.txt
# 搜索权限为222(--w--w--w-,即所有者,所属组,其他人都只有写权限)的文件
~ find -perm 222 -type f -ls
# 搜索权限为-222(--w--w--w-,即所有者,所属组,其他人都要有写权限)为文件和目录
~ find -perm -222 -type f -type d -ls
# 搜索权限为/222(--w--w--w-,即所有者,所属组,其他人任意一组有写权限)为文件和目录
~ find -perm /222 -type f -type d -ls
-regextype type
Changes the regular expression syntax understood by -regex and -iregex tests which occur later on
the command line. Currently-implemented types are emacs (this is the default), posix-awk, posix-
basic, posix-egrep and posix-extended.
-regex pattern
File name matches regular expression pattern. This is a match on the whole path, not a search.
For example, to match a file named ./fubar3', you can use the regular expression
.*bar.’ or
.*b.*3', but not
f.*r3’. The regular expressions understood by find are by default Emacs Regular
Expressions, but this can be changed with the -regextype option.
范例:
find /data -regextype posix-extended -regex "regix"
范例:
#备份配置文件,添加.orig这个扩展名
find -name ".conf" -exec cp {} {}.orig \;
#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name ".sh" –exec chmod 755 {} \;
~ find -name "*.sh" -ok mv {} /opt \;
~ find -name "*.sh" -exec mv {} /opt \;
由于很多命令不支持管道 | 来作为传递的参数,xargs 用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或者回车符将 stdin 的数据分隔成为参数。(即很多命令不支持标准输入,可以通过 xargs 命令来使命令支持标准输入)
另外,许多命令不能接受过多的参数,命令执行可能会失败,xargs 可以解决。
注意:文件名或者是其他意义的名词内含有空格符的情况。
find 和 xargs 的组合:
find | xargs COMMMAND
范例:
# xargs 命令的使用
~ type xargs
~ xargs --help
Usage: xargs [OPTION]... COMMAND INITIAL-ARGS...
~ echo /etc/passwd | xargs ls -l
-rw-r--r-- 1 root root 1927 May 21 22:57 /etc/passwd
# xargs 默认会以横向的方式显示(默认行为)
~ echo {1..10} | xargs
~ echo {1..10} | xargs -n1
~ echo {1..10} | xargs -n2
~ seq 3
1
2
3
~ seq 3 | xargs
1 2 3
# 删除当前目录下的大量文件
~ ls | xargs rm -rf
# 批量创建用户
echo user{1..9} | xargs -n1 useradd
# 批量删除用户
echo user{1..9} | xargs -n1 userdel -rf
#这个命令是错误的,7代表可读可写可执行,权限也为或的关系,0代表不关心
find /sbin/ -perm /700 | ls -l
# 查找有特殊权限的文件,并排序,7代表可读可写可执行,权限也为或的关系,0代表不关心
find /bin/ -perm /7000 | xargs ls -lS
# 此命令和上面有何区别?查找是否有suid,sgid,stick三个特殊权限均有的文件,0代表不关心
find /bin/ -perm -7000 | xargs ls -lS
# 以字符nul分隔
# print 0 :0作为文件名的切割符
find -type f -name "*.txt" -print0 | xargs -0 rm
# 并发执行多个进程
seq 100 | xargs -i -P10 wget -P /data http://10.0.0.100/{}.html
# 并行下载bilibili视频
yum install -y python3-pip
pip3 install you-get
seq 10 | xargs -i -P3 you-get https://www.bilibili.com/video/BV1PZ4y1k7m1?p={}&spm_id_from=pageDriver
#并行下载视频 -P 并发量为 3
seq 389 | xargs -i -P3 you-get https://www.bilibili.com/video/av36489007?p={}
# 1、查找/var目录下属主为root,且属组为mail的所有文件
# 2、查找/var目录下不属于root、lp、gdm的所有文件
# 3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
# 4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
# 5、查找/etc目录下大于1M且类型为普通文件的所有文件
# 6、查找/etc目录下所有用户都没有写权限的文件
# 7、查找/etc目录下至少有一类用户没有执行权限的文件
# 8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
# 1、查找/var目录下属主为root,且属组为mail的所有文件
~ find /var -type f -user root -group mail -ls
# 2、查找/var目录下不属于root、lp、gdm的所有文件
~ find /var ! \( -user root -o -user lp -o -user gdm \) -type f | xargs ls -l
~ find /var ! -user root ! -user lp ! -user gdm -type f | xargs ls -l
# 3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
~ find /var ! \( -user root -o -user postfix \) -mtime -7 -type f -ls
~ find /var ! -user root ! -user postfix -mtime -7 -type f -ls
# 4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
~ find / -nouser -nogroup -atime -7 -type f -ls
# 5、查找/etc目录下大于1M且类型为普通文件的所有文件
~ find /etc -size +1M -type f | xargs ls -lh
# 6、查找/etc目录下所有用户都没有写权限的文件
~ find /etc ! -perm /222 -type f -ls
# 7、查找/etc目录下至少有一类用户没有执行权限的文件
~ find /etc ! -perm /111 -type f -ls
# 8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
~ find /etc/init.d -perm -111 -perm /002 -ls
~ find /etc/init.d -perm -113 -ls
压缩的简单思路:就是将文件中相同的字符变成一个较短的单一的字符来表示;例如:如果zhongzw的字符在进行压缩时,会制作一个转换表,在转换表中会有一个z来表示zhongzw,这样就节省了空间。如果有1M的0,在压缩时,则会显示1M0,用1M0来表示1M的0。3个字符来表示1M的0。
主要针对单个文件压缩,而非目录
Linux compress命令是一个相当古老的 unix 档案压缩指令,压缩后的档案会加上一个 .Z 延伸档名以区别未压缩的档案,压缩后的档案可以以 uncompress 解压。若要将数个档案压成一个压缩档,必须先将档案 tar 起来再压缩。由于 gzip 可以产生更理想的压缩比例,一般人多已改用 gzip 为档案压缩工具。
此工具来自于ncompress包,此工具目前已经很少使用
对应的文件是Z后缀
格式:
compress Options [file ...]
uncompress file.Z # 解压缩
常用选项:
zcat file.Z 不显式解压缩的提前下查看文本文件的内容
范例:
zcat file.Z > file
uncompress file.Z 解压缩
范例:常用搭配
compress-c message > message.Z
uncompress -c message.Z > m
zcat message.Z
Linux gzip命令用于压缩文件。
gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出".gz"的扩展名。
来自 gzip 包,对应的文件是 .gz 后缀
格式:
gzip [OPTION]... FILE...
常用选项:
范例:
# 解压缩
gunzip file.gz
# 不显式解压缩的提前下查看文本文件的内容
zcat file.gz
范例:常用搭配
bzip2 -c messages > messages.bz2 = bzip2 -k messages
bunzip2 -c messages.bz2 > messages.bz2
bzcat messages.bz2
cat messages | bzip2 > messagesbak.bz2
cat messages | xz > messagebk.xz
Linux bzip2命令是.bz2文件的压缩程序。
bzip2采用新的压缩演算法,压缩效果比传统的LZ77/LZ78压缩演算法来得好。若没有加上任何参数,bzip2压缩完文件后会产生.bz2的压缩文件,并删除原始的文件。
来自 bzip2 包,对应的文件是 .bz2 后缀
格式:
bzip2 [OPTION]... FILE...
常用选项:
范例:
# 解压缩
bunzip2 file.bz2
# 不显式解压缩的提前下查看文本文件的内容
bzcat file.bz2
范例:常用搭配
bzip2 -c messages > messages.bz2 = bzip2 -k messages
bunzip2 -c messages.bz2 > messages.bz2
bzcat messages.bz2
cat messages | bzip2 > messagesbak.bz2
cat messages | xz > messagebk.xz
来自 xz 包,对应的文件是 .xz 后缀
格式:
xz [OPTION]... FILE...
常用选项:
范例:
# 解压缩
unxz file.xz
# 不显式解压缩的提前下查看文本文件的内容
xzcat file.xz
范例:常用搭配
xz -k messages
unxz -k messages.xz
xzcat messages.xz
zip 可以实现打包目录并且压缩
zip 可以实现打包目录和多个文件成一个文件并压缩,但可能会丢失文件属性信息,如:所有者和组信息,一般建议使用tar代替
分别来自于zlip和unzip包
对应的文件是.zip后缀
范例:zip 的帮助
~ zip --help
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete OS files)
-r recurse into directories -j junk (don't record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zipfile prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-y store symbolic links as the link instead of the referenced file
-e encrypt -n don't compress these suffixes
-h2 show more help
# 查看更多帮助
~ zip -h2
Extended Help for Zip
See the Zip Manual for more detailed help
Zip stores files in zip archives. The default action is to add or replace
zipfile entries.
Basic command line:
zip options archive_name file file ...
Some examples:
Add file.txt to z.zip (create z if needed): zip z file.txt
Zip all files in current dir: zip z *
Zip files in current dir and subdirs also: zip -r z .
范例:
#打包并压缩
zip –r /backup/sysconfig.zip /etc/sysconfig/
#默认解压缩至当前目录
unzip /backup/sysconfig.zip
#解压缩至指定目录
unzip /backup/sysconfig.zip -d /tmp
#解压缩至指定目录
cat /var/log/messages | zip messages - (-代表/var/log/messages)
unzip -p message.gz > message #-p 表示管道
范例:交互式加密和解密
~ zip -e kubesphere.zip *
Enter password:
Verify password:
adding: etc.zip (stored 0%)
adding: messages.bz2 (stored 0%)
adding: messages.gz (stored 0%)
adding: messages.xz (stored 0%)
adding: messages.Z (stored 0%)
~ unzip kubesphere.zip
Archive: kubesphere.zip
[kubesphere.zip] etc.zip password:
password incorrect--reenter:
范例:非交互式加密和解密
~ zip -P Admin@h3c kubesphere.zip *
adding: etc.zip (stored 0%)
adding: messages.bz2 (stored 0%)
adding: messages.gz (stored 0%)
adding: messages.xz (stored 0%)
adding: messages.Z (stored 0%)
~ unzip -P Admin@h3c kubesphere.zip
Archive: kubesphere.zip
tar 即 Tape ARchive,磁带归档,经常用于备份。可以对目录和多个文件打包一个文件,并且可以压缩,保留文件属性不丢失,常用于备份功能,推荐使用。
tar 是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。
对应的文件是 .tar 后缀
格式:
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F