主要内容:
tar归档及压缩、重定向与管道操作、find命令查找、wc、find高级用法exec{}\;、vim高级使用;
一、归档和压缩(tarball)
tar 用于归档文件和目录,它的名称来源于 "tape archive",最初设计用于磁带备份。tar 本身并不进行压缩,它只是将多个文件和目录打包成一个单独的归档文件(通常称为 tarball)。
归档的含义:
- 归档是指将多个文件和目录组合成一个单独的文件。这个过程不会改变文件的内容,也不会减小文件的大小。归档的主要目的是为了方便文件的传输、备份和存储。
压缩的含义:
- 压缩是指通过某种算法减小文件的体积,以便节省存储空间和提高传输效率。常见的压缩算法包括 gzip、bzip2 和 xz。
tar工具的常用选项
- [-c] 创建归档
- [-x] 释放归档
- [-f] 指定归档/释放的文件名称(必须在所有选项的最后)
- [-z、-j、-J] 调用.gz、.bz2、.xz格式的工具进行处理
- [-t] 显示归档中的文件清单
- [-C] 指定释放路径
- [-v] 显示压缩内容
1)制作 tar备份包
格式:tar -[z、j、J]cf /存放路径/压缩包名字 /源文件...
注意:压缩包名字的扩展名比如.tar.gz,可不写,只为方便辨认,不写压缩包后缀颜色为黑色;
注意:压缩包名字如果不带存放路径,是默认保存在当前路径;
① tar -zcf 备份文件.tar.gz 被备份的文档...
② tar -jcf 备份文件.tar.bz2 被备份的文档...
③ tar -Jcf 备份文件.tar.xz 被备份的文档...
例如,使用 tar
命令归档一个目录:
tar -cvf archive.tar /path/to/directory
-c
表示创建一个新的归档文件。-v
表示在归档过程中显示详细信息。-f
指定归档文件的名称。
例如,使用 tar
和 gzip
结合创建一个压缩的归档文件:
tar -czvf archive.tar.gz /path/to/directory # 使用 gzip 压缩
-z
表示使用 gzip 进行压缩。
同样,可以使用 bzip2
或 xz
进行压缩:
tar -cjvf archive.tar.bz2 /path/to/directory # 使用 bzip2 压缩
tar -cJvf archive.tar.xz /path/to/directory # 使用 xz 压缩
2)从tar备份包恢复文档
格式:tar -xf /路径/备份文件名 [-C 目标文件夹]
注意:压缩时若输入的绝对路径,会把路径压缩到压缩包内,但目录为空目录,无影响;
注意:释放文档若不指定路径,则释放在当前目录;
注意:压缩一个例如/opt下的文件,释放也在opt下,同名文件会强制覆盖;
例如:压缩时若输入的绝对路径,会把路径压缩到压缩包内,但目录为空目录,无影响;
[root@student ~]# mkdir /nsd01
[root@student ~]# tar -xf /opt/passwd.tar.gz -C /nsd01/ //释放压缩包
[root@student ~]# ls /nsd01/
etc //空目录
[root@student ~]# ls /nsd01/etc/
Passwd
常见报错:释放的压缩包不存在时,释放后报错无法open:没有那个文件或目录
[root@student ~]# tar -xf /opt/pass.tar.gz -C /nsd01/
tar: /opt/pass.tar.gz:无法 open: 没有那个文件或目录
tar: Error is not recoverable: exiting now
3)查看tar备份包内容
格式:tar -tf 备份文件.tar.gz
例如:
[root@student ~]# tar -tf /opt/passwd.tar.bz2 etc/passwd
常见报错:
[root@student ~]# tar -tf /nsd01/etc
tar: /nsd01/etc:无法 read: 是一个目录
tar: 处于磁带的起点,现在退出
tar: Error is not recoverable: exiting now
[root@student ~]# tar -tf /nsd01/etc/passwd //压缩包已释放非归档文件
tar: 它似乎不像是一个 tar 归档文件
tar: 跳转到下一个头
tar: 由于前次错误,将以上次的错误状态退出
二、重定向输出
用途:将屏幕显示信息作为内容保存到文件(文件不存在时,会新建文件)
格式:
- 覆盖重定向:cmd命令-显示内容 > 保存文件
- 追加重定向:cmd命令-显示内容 >> 保存文件
注意:命令有输出的才能作为显示内容,写入文本文件当中
例如:覆盖重定向
[root@student ~]# head -3 /etc/passwd > /opt/passwd.txt
[root@student ~]# cat /opt/passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
例如:追加重定向
[root@student ~]# hostname >> /opt/passwd.txt
[root@student ~]# cat /opt/passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
student.tmooc.cn
补充:重定向通常结合 Echo 打印命令,将内容打印输出
例如:
[root@student ~]# echo AJ.nike.cn >> /etc/hostname
[root@student ~]# cat /etc/hostname
student.tmooc.cn
AJ.nike.cn
三、管道操作
用途:将前一条命令的标准输出传递给后一条命令,作为后面命令的参数处理;
格式:cmd1命令 | cmd2命令 [ | cmd3命令] .. ..
注意:前面命令必须有输出,才能传递后面命令作为参数;
例如:显示ifconfig命令的前两行内容
[root@student ~]# ifconfig | head -2
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.124 netmask 255.255.255.0 broadcast 192.168.122.255
例如:显示/etc/passwd第九行内容
[root@student ~]# cat -n /etc/passwd | head -9 | tail -1
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
例如:重定向配合管道输出
[root@student ~]# cat -n /etc/passwd | head -9 | tail -1 > /opt/1.txt
[root@student ~]# cat /opt/1.txt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
例如:通过重定向,去掉“空行”和“注释”的显示
[root@student ~]# grep -v ^# /etc/default/useradd | grep -v ^$ > /opt/user.txt
[root@student ~]# cat /opt/user.txt
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
四、find查找基本使用
用途:根据预设的条件递归查找对应的文件
格式:find [目录] [选项1] [选项2]...
注意:可以查找到隐藏文件并输出;
注意:不写目录,则为当前目录查找;
常用选项表示:
- [-type] 类型(f 文件、d 目录、l 快捷方式)
- [-name] “文档名称”
- [-size] +|-文件大小(k、M、G)(注意:-1G、-1M无法识别,1024M)
- [-user] 用户名(文件的所有者)
- [-mtime] 修改时间(过去时间)
例如1:查找类型为目录
[root@student ~]# find /boot/ -type d
/boot/
/boot/efi
/boot/efi/EFI
/boot/efi/EFI/centos
...
例如2:查找类型为快捷方式
[root@student ~]# find /etc -type l
/etc/mtab
/etc/fonts/conf.d/65-0-lohit-bengali.conf
/etc/fonts/conf.d/20-unhint-small-dejavu-sans.conf
[root@student ~]# ls -l /etc/mtab
lrwxrwxrwx. 1 root root 17 3月 1 14:53 /etc/mtab -> /proc/self/mounts
...
例如3:查找类型为文件
[root@student ~]# find /boot/ -type f
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
/boot/grub2/i386-pc/gcry_rsa.mod
...
例如4:查找名字为passwd
[root@student /]# find /etc/ -name "passwd"
/etc/passwd
/etc/pam.d/passwd
例如5:查找名字为tab结尾
[root@student /]# find /etc/ -name "*tab"
/etc/fstab
/etc/crypttab
/etc/mtab
/etc/selinux/targeted/active/modules/100/updfstab
...
[root@student /]# ls /etc/*tab //ls方式查找之能查/etc目录下匹配*tab
/etc/anacrontab /etc/crypttab /etc/inittab /etc/rwtab
/etc/crontab /etc/fstab /etc/mtab /etc/statetab
例如6:查找名字为a开头
[root@student /]# find /root/ -name "a*"
/root/anaconda-ks.cfg
/root/.cache/abrt
/root/.cache/abrt/applet_dirlist
/root/.cache/abrt/applet_dirlist
例如7:两个[条件]同时满足
[root@student /]# mkdir /mnt/nsd01
[root@student /]# mkdir /mnt/nsd02
[root@student /]# touch /mnt/nsd03.txt
[root@student /]# echo 1234 > /mnt/nsd04.txt
[root@student /]# find /mnt/ -name "nsd*"
/mnt/nsd01
/mnt/nsd02
/mnt/nsd03.txt
/mnt/nsd04.txt
[root@student /]# find /mnt/ -name "nsd*" -type f //查找名字满足nsd开头且类型为文件
/mnt/nsd03.txt
/mnt/nsd04.txt
[root@student /]# find /mnt/ -name "nsd*" -type d //查找名字满足nsd开头且类型为目录
/mnt/nsd01
/mnt/nsd02
例如8:选项[-o],两个[条件]满足其一
[root@student /]# find /mnt/ -name "nsd*" -o -type f //
/mnt/nsd01
/mnt/nsd02
/mnt/nsd03.txt
/mnt/nsd04.txt
例如9:查找满足大小文件
[root@student /]# find /boot/ -size +300k
/boot/grub2/fonts/unicode.pf2
/boot/System.map-3.10.0-862.el7.x86_64
/boot/vmlinuz-3.10.0-862.el7.x86_64
...
例如10:
[root@student /]# find /boot/ -size -2M
/boot/
/boot/efi
/boot/efi/EFI
...
注意:查找的文件大小用整型,浮点型识别不了
[root@student /]# find /boot/ -size -5.9M
find: Invalid argument `-5.9M' to -size
例如11:查找数据所有者为natasha
[root@student /]# useradd natasha
[root@student /]# ls /home/
lisi natasha student wangwu zhangsan
[root@student /]# find /home/ -user natasha
/home/natasha
/home/natasha/.mozilla
/home/natasha/.mozilla/extensions
/home/natasha/.mozilla/plugins
/home/natasha/.bash_logout
/home/natasha/.bash_profile
/home/natasha/.bashrc
/proc为内存的数据,一般不占用磁盘空间
[root@student /]# find / -user natasha -type f
find: ‘/proc/9126/task/9126/fdinfo/5’: 没有那个文件或目录
find: ‘/proc/9126/fdinfo/6’: 没有那个文件或目录
/var/spool/mail/natasha
/home/natasha/.bash_logout
/home/natasha/.bash_profile
/home/natasha/.bashrc
例如12:查找3天之前的数据
[root@student /]# find /root/ -mtime +3
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
/root/.cshrc
/root/.tcshrc
例如13:查找最近3天之内的数据
[root@student /]# find /root/ -mtime -3
/root/
/root/anaconda-ks.cfg
/root/.cache
/root/.cache/dconf
/root/.cache/dconf/user
五、wc统计行数
用途:输出每个指定文件的行数、单词计数和字节数
格式:wc [选项]... [文件]...
常用选项
- [-c] --bytes 输出字节数统计
- [m] --chars 输出字符数统计
- [l] --lines 输出行数统计
- [L] --max-line-length 显示最长行的长度
- [w] --words 显示单词计数
例如:
[root@student /]# wc /etc/passwd
45 86 2330 /etc/passwd //分别是行数 单词数 字节数 文件名
例如:
[root@student /]# find /root/ -name "a*" | wc -l //显示行数
11
[root@student /]# find /etc/ -name "*.conf" | wc -l
426
六、Find高级使用
用途:根据条件查找并处理结果;
格式:find [范围] [条件] -exec 处理命令 {} \;
详细解释:
- 范围:指定
find
命令搜索的起点目录。例如,/home/user
表示从/home/user
目录开始搜索。- 条件:指定
find
命令搜索文件和目录时使用的条件。条件可以包括文件名、文件类型、文件大小、修改时间等。例如,-name "*.txt"
表示搜索所有文件名以.txt
结尾的文件。- -exec:这是一个选项,表示对找到的每个文件执行指定的命令。
- 处理命令:这是你希望对找到的文件执行的命令。
{}
是一个占位符,表示find
命令找到的每个文件。- ;:这是
-exec
选项的结束标志。注意,\;
前面有一个空格,并且\
是用来转义分号的。
例如1:查找满足大小文件并拷贝到/opt 目录下
[root@student /]# find /boot/ -size +10M
/boot/initramfs-0-rescue-48ddf055438941f29c5b67418ab66380.img
/boot/initramfs-3.10.0-862.el7.x86_64.img
[root@student /]# find /boot/ -size +10M -exec cp {} /opt/ \;
[root@student /]# ls /opt/ini*
/opt/initramfs-0-rescue-48ddf055438941f29c5b67418ab66380.img
/opt/initramfs-3.10.0-862.el7.x86_64.img
常见报错1:结束符号错误
[root@student /]# find /boot/ -size +10M -exec cp {} /opt/ \:
find: 遗漏“-exec”的参数
常见报错2:{}查找结果输入错误
[root@student /]# find /boot/ -size +10M -exec cp { } /opt/ \;
cp: 无法获取"{" 的文件状态(stat): 没有那个文件或目录
cp: 无法获取"}" 的文件状态(stat): 没有那个文件或目录
cp: 无法获取"{" 的文件状态(stat): 没有那个文件或目录
cp: 无法获取"}" 的文件状态(stat): 没有那个文件或目录
常见报错3:find是一层一层查找,查找匹配输出一次结果,再匹配再输出
[root@student /]# find /boot/ -size +10M
/boot/initramfs-0-rescue-48ddf055438941f29c5b67418ab66380.img
/boot/initramfs-3.10.0-862.el7.x86_64.img
[root@student /]# find /boot/ -size +10M -exec tar -zcf /opt/test.tar.gz {} \;
tar: 从成员名中删除开头的“/”
tar: 从成员名中删除开头的“/”
[root@student /]# tar -tf /opt/test.tar.gz
boot/initramfs-3.10.0-862.el7.x86_64.img
例如2:假设在 /home/user
目录下找到所有 .txt
文件,并对每个文件执行 cat
命令(显示文件内容)
find /home/user -name "*.txt" -exec cat {} \;
命令工作流程如下:
find /home/user -name "*.txt"
:在/home/user
目录下找到所有文件名以.txt
结尾的文件。-exec cat {} \;
:对找到的每个文件执行cat
命令,显示文件内容。
注意事项
{}
和\;
之间的空格是必需的。\;
必须用反斜杠\
转义,以防止 shell 解释它。
替代语法
-exec
还有一种替代语法,使用 +
而不是 \;
,这会使得 find
命令尽可能多地传递文件给 处理命令
,从而提高效率:这种情况下,cat
命令会一次性处理多个文件,而不是逐个处理。
find /home/user -name "*.txt" -exec cat {} +
七、Vim的命令模式操作
1)光标跳转
2)复制/粘贴/删除
3)查找/撤销/保存
八、末行模式操作
1)保存/退出/文件操作
2)字符串替换
3)开关参数的控制
补充内容:
Linux中大多数配置文件内容,以#开头的行为注释行,还包括空行内容;
例如:显示 ^$ 空行
[root@student ~]# grep ^$ /etc/default/useradd
# 空行
[root@student ~]#
例如:取反空行
[root@student ~]# grep -v ^$ /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
例如:显示配置文件有效信息(去除以#开头的注释行和去除空行)
[root@student ~]# grep -v ^# /etc/login.defs | grep -v ^$ > /opt/log.txt
[root@student ~]# cat /opt/log.txt
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
小结:
本篇章节为 【第一阶段】ADMIN-DAY4 的学习笔记,可以初步了解到 tar归档及压缩、重定向与管道操作、find命令查找、wc、find高级用法exec{}\;、vim高级使用。除此之外推荐参考相关学习网址:
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。