03Linux初级之文件管理和IO重定向20210118
1.文件系统目录结构
2.常见的文件系统目录
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录 /bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序 /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序 /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules) /lib64:专用于x86_64系统上的辅助共享库文件存放位置 /etc:配置文件目录 /home/USERNAME:普通用户家目录 /root:管理员的家目录 /media:便携式移动设备挂载点 /mnt:临时文件系统挂载点 /dev:设备文件及特殊文件存储位置 b: block device,随机访问 c: character device,线性访问 /opt:第三方应用程序的安装位置 /srv:系统上运行的服务用到的数据 /tmp:临时文件存储位置 /usr: universal shared, read-only data bin: 保证系统拥有完整功能而提供的应用程序 sbin: lib:32位使用 lib64:只存在64位系统 include: C程序的头文件(header files) share:结构化独立的数据,例如doc, man等 local:第三方应用程序的安装位置 bin, sbin, lib, lib64, etc, share /var: variable data files cache: 应用程序缓存数据目录 lib: 应用程序状态信息数据 local:专用于为/usr/local下的应用程序存储可变数据 lock: 锁文件 log: 日志目录及文件 opt: 专用于为/opt下的应用程序存储可变数据 run: 运行中的进程相关数据,通常用于存储进程pid文件 spool: 应用程序数据池 tmp: 保存系统两次重启之间产生的临时数据 /proc: 用于输出内核与进程信息相关的虚拟文件系统 /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统 /selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置
3.举例Windows的根目录,方便理解
4.Linux下的文件类型
⑦种文件
- 普通文件 d 目录文件directory b 块设备block c 字符设备character l 符号链接文件link p 管道文件pipe s 套接字文件socket
1.普通文件 -
2.目录文件 d (蓝色)
3.链接文件 l(相当于windows中的快捷方式)
4.字符设备文件 c
5.块设备文件 b (block)
6.管道文件 p(信息交互)
先进先出,单向(A通过管道到B)
7.套接字文件s (双向传输的,可以读写)
支持双向读写
8.socket和pipe的文件(同一张图中展示结果)
5.文件名最长255个字节
Alt + # 提示输入指定字符后,重复显示该字符#次,这个操作可以快速生成很多个文件
6.文件颜色各代表的文件类型
7.绝对路径:完整地描述了文件的位置
1 以正斜杠/ 即根目录开始 2 完整的文件的位置路径 3 可用于任何想指定一个文件名的时候
8.相对路径名
不以斜线开始 一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置 可以作为一个简短的形式指定一个文件名
基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
9.pwd显示当前工作目录
10.命令 cd : change directory 改变目录
可以使用绝对或相对路径
切换至父目录: cd .. 切换至当前用户主目录: cd 切换至以前的工作目录: cd -
cd信息放在$OLDPWD中
11.ls 命令可以列出当前目录的内容或指定目录
常见选项: -a 包含隐藏文件 -l 显示额外的信息 -R 目录递归 -ld 目录和符号链接信息 -1 文件分行显示 -S 按从大到小排序 -t 按mtime排序 -u 配合-t选项,显示并按atime从新到旧排序 -U 按目录存放顺序显示 -X 按文件后排序
ll and ls 比较
说明:ls 查看不同后文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义
ll实际上是个别名,即ls -l --color
不使用别名,前面加"\",比如:ls / (#查看根目录的文件夹)
举例: ls -l
举例:ls -l /boot 和ls -ld /boot (加个-d查看文件夹本身属性)
ls-l 显示额外的信息
ls -ld /boot查看文件夹本身大小
ls -lt 查看文件时间
ls -lS 文件从大到小排列
ls -R /boot递归(遍历子目录)
ls -rlS 反过来文件从小到大排列 小r是反转
#ubuntu环境#
-F 会自动判断文件的类型
12.文件颜色
颜色配置文件保存在DIR_COLORS中
比如.zip 01;31(高亮;红色)
13.df :disk free
此命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计
14.查看文件状态 stat
每个文件有三个时间戳:
access time 访问时间,atime,读取文件内容 modify time 修改时间,mtime,改变文件内容(数据) change time 改变时间,ctime,元数据发生改变
修改了文件的属性,change time变了
#使用命令noatime禁用,较少磁盘的IO。
15.file 使用file命令检查文件的类型
范例:windows的文本格式和Linux的文本格式的区别
#安装转换工具
[root@centos8 data]#dnf -y install dos2unix
#1.将Windows的文本格式转换成的Linux文本格式
[root@centos8 data]#dos2unix win.txt
dos2unix: converting file win.txt to Unix format...
#2.将Linux的文本格式转换成Windows的文本格式
[root@centos8 data]#unix2dos win.txt
unix2dos: converting file win.txt to DOS format...
[root@centos8 data]#file win.txt
win.txt: ASCII text, with CRLF line terminators
16.文件通配符模式 wildcard pattern
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符
常见的通配符如下:
* 匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件 ? 匹配任何单个字符 ~ 当前用户家目录 ~mage 用户mage家目录 ~+和. 当前工作目录 ~- 前一个工作目录 [0-9] 匹配数字范围 [a-z] 字母 [A-Z] 字母 [wang] 匹配列表中的任何的一个字符 [^wang] 匹配列表中的所有字符以外的字符
再看一个对比:
17.创建空文件和刷新时间
touch命令可以用来创建空文件或刷新已有文件的时间
[root@centos7-kevin306 ~]# touch `date -d "-1 day" +%F_%T`.log
[root@centos8 ~]# ls
anaconda-ks.cfg reset_centos-kevin00.sh
[root@centos8 ~]# touch $(date -d "1 year" +%F_%T).log
[root@centos8 ~]# ls
2022-08-23_01:35:36.log anaconda-ks.cfg reset_centos-kevin00.sh
18.复制文件和目录
利用 cp(copy)命令可以实现文件或目录的复制
cp -av /etc/sysconfig/ /tmp (#加上v就显示了拷贝的过程)
-a 归档,相当于-dR --preserv=all,常用于备份功能
-i 如果目标已存在,覆盖前提示是否覆盖
举例:#cp -av /etc/ /data/backup`date +%F`
cp的别名:#alias cp alias cp='cp -i'
19. 移动和重命名文件
mv (move)命令可以实现文件或目录的移动和改名
同一分区移动数据,速度很快:数据位置没有变化
不同分区移动数据,速度相对慢:数据位置发生了变化
mv只能一次处理一个文件改名,而利用 rename 可以批量修改文件名
#为所有的conf文件加上.bak后缀:
[root@centos8 ~]# rename '.bak' '' *.bak
20. 删除文件
使用 rm (remove)命令可以删除文件
注意:此命令非常危险,慎重使用,建议使用mv 代替 rm
使用该命令保护自己,避免误删除文件,类似一个还没清空的“垃圾桶”功能:
#alias rm='DIR=/data/backup`date +%F%T`;mkdir $DIR;mv -t $DIR'
取消别名 unalias rm
1.检查一下rm命令
[root@centos7-kevin306 ~]# alias rm alias rm='DIR=./data/backup`date +%F%T`;mkdir $DIR;mv -t $DIR'
2.举例删除(命令改为移动之后使用rm即可删除)
3.使用mv移动到原来的位置
举例:以下使用rm 删除文件
#1.alise的原始命令是 rm -i
#2.\rm 使用的是rm的原始命令
#3.rm -f 强制删除
举例:删除 -f这个文件
rm --help的删除方式
1.rm -- -f (后面加了2个-)
2.或者这样也可以删除 rm /root/-f
举例:rm -rf /data 删除/data/下面的所有数据
#1创建文件夹/dir1
#2直接使用rm无法删除
#3使用rm -rf +文件夹路径 删除(-r 递归 -f强制)
最后贴一个准备跑路的命令(慎用) :#rm -rf /*
上面有空格,会提示你这是个很危险的操作,是否真的是需要删除/(根)
下面的没空格,一回车就全删了(谨慎操作),删除中也会有报错,报错的内容是一些挂载的光驱(/misc/cd/),或者缓存文件等(/proc/)
#测试一下是否可用,查看/下面,文件不全了,echo /boot* 看看内容,看不到内容
#使用tab键补全,补不出来内容
以下为经验教训小结:非常重要!!!
很多人想必看到这里应该不会贸然执行rm删除数据了;
但是删除根是会有很多千奇百怪的方式出现的;
#1.比如这个(本意是删除/data下面的数据,但是./data 后面多个空格,相当于删除/data下面的数据的同时,删除根/ 下面的文件)
正确的是这个操作:(/data后不能有空格)
#2. 还有一种情况:正常是这样的
但是忘记给DIR=?赋值了(少了这个DIR=/data;),这时候就相当于DIR是个空值
相当于 rm -rf /* ,结果也是删根/,后果不堪设想
#3. 有的公司比较极端,为了确保生产,直接把rm命令删除了
21.目录操作
1.创建目录 mkdir
常见选项:
-p: 存在于不报错,且可自动创建所需的各目录 -v: 显示详细信息 -m MODE: 创建目录时直接指定权限
注意:mkdir只能创建一级目录,需要再创建子目录就要加-p
2.删除空目录rmdir
3.显示目录树 tree
注意:rmdir只能删除空目录(包括空文件夹),如果想删除非空目录,可以使用rm -r 命令,递归删除目录树
22.节点编号
df -i 查看inodes编号数量,每次建一个文件,都会少一个节点编号
比如查看得/boot下的剩余的iNodes编号还有523986,直接touch尝试创建出来,发现文件国产无法创建成功,
通过另外一个命令曲线救国来创建 #echo /boot/testdir/file{1..523985}.txt |xargs touch
/boot分区百分百被使用了
一次性创建很多大文件
[root@centos8-kevin306 ~]# dd if=/dev/zero of=/boot/bigfile.log bs=1M count=800
案例1:
Q:提示空间满 No space left on device,但 df 可以看 到空间很多,为什么?
A:不是空间不足,是节点编号没有了,无法创建
案例2:提示空间快满,使用 rm 删除了很大的无用文件后,df 仍然看到空间不足,为什么?如何解决
1#假如开启vim,访问修改这个大的文件,使用rm删除了文件,但是空间不会马上释放
2#ls /boot/bigfile.log 验证查看文件确实不存在了,但是空间不释放
3#lsof |grep deleted 执行之后显示出来的文件,发现确实还在被一个vim的程序给占用着等待编辑
4#ps aux|grep vim 查看进程 1902
5#关掉VIM程序,1902进程就没有了,再看空间,就释放出来了
6#但是也有小问题:可能会有业务在使用,或者不好关,是一个生产中的数据库等,使用下面这个办法挺好
7#再次创建文件
[root@centos8-kevin306 boot]# dd if=/dev/zero of=/boot/bigfile.log bs=1M count=800
并新开窗口使用vim打开编辑这个文件
8#使用> /boot/bigfile.log
9#使用ll /boot/bigfile.log查询结果,文件已被清空,文件大小为0
10#空间释放了,就可以删除这个文件了,不需要关闭vim程序
注意的是这个办法依赖shell环境执行,有时候csh不支持这个办法!
最稳妥的还是下面这个清空办法
#cat /dev/null > /boot/bigfile.log
null是个空文件,相当于太空的黑洞,垃圾箱一般,执行之后直接显示为0,成功
案例3:清除issue里面的内容,里面有23个字节的内容
#使用cat /dev/null > /etc/issue清除文件内容
23硬链接
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
创建硬链接会在对应的目录中增加额外的记录项以引用文件 对应于同一文件系统上一个物理文件 每个目录引用相同的inode号 创建时链接数递增 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文 件被删除 不能跨越驱动器或分区 不支持对目录创建硬链接
硬链接创建成功后,本质上是2个文件,没有依赖关系
24软符号 ( symbolic ) 或 软 (soft)链接
一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件
软链接特点
一个符号链接的内容是它引用文件的名称 可以对目录创建软链接 可以跨分区的文件实现 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的 引用计数 在创建软链接时, 如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目 录,但是软链接的路径如果是相对路径,则是相对于当前工作目录
软链接创建成功后,本质上是1个文件,有依赖关系,相当于windows中的快捷方式
1.cp一个文件 命名为 f1.txt
使用软链接 ln -s f1.txt f2.txt
创建成功之后是浅蓝色,大小也很小,因为它是一个快捷方式
节点号增加了1个,链接数都还是1,没有增加,新文件f2.txt变成浅蓝色小箭头指向f1.txt
2. f1.txt删除,之后,f2.txt就不能访问了
3.特点:支持跨分区创建软链接 (绝对路径创建的)
4.特例:跨分区创建软链接,路径是相对于相对路径和绝对路径下的写法
f1.txt没写路径,它还是优先去/root下面找这个文件,肯定是找不到的,
所以要写出访问路径,相对于创建出来的f2.txt这个软链接的文件的路径,先..回到根目录,然后再进入/data下面
绝对路径:
软链接的路径写法是相对于创建出来的f3.txt这个软链接的文件的路径/root,而不是当前文件的路径/data
5.软链接还支持文件夹
举例:APP软件版本升级
1.创建app -v0.1
2.创建软链接 #ln -s app-v0.1/ app
3.创建新的版本v0.2并指向新版本,
删除旧的软链接;
创建新的软链接 #ln -s app-v0.2/ app 让用户访问
4.软件降级:
1.删除旧的软链接;
2.创建新的软链接 #ln -s app-v0.1/ app 让用户访问
6 #查看链接文件指向的原文件
#绝对路径
ln -s /data/dir /data/dirlink
#相对路径
cd /data
ln -s ../data/dir /root/dirlink
rm -rf /data/dirlink #删除软链接本身,不会删除源目录内容
rm -rf /data/dirlink/ #删除源目录的文件,不会删除链接文件
#查看链接文件指向的原文件
readlink /data/dirlink
25重定向和管道
[root@centos7-kevin306 ~]# ll /dev/std* lrwxrwxrwx 1 root root 15 Sep 6 03:15 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 Sep 6 03:15 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 Sep 6 03:15 /dev/stdout -> /proc/self/fd/1
#1范例:文件描述符
[root@centos8 ~]# ll /proc/self/fd/* ls: cannot access '/proc/self/fd/255': No such file or directory lrwx------ 1 root root 64 Sep 6 20:33 /proc/self/fd/0 -> /dev/pts/0 lrwx------ 1 root root 64 Sep 6 20:33 /proc/self/fd/1 -> /dev/pts/0 lrwx------ 1 root root 64 Sep 6 20:33 /proc/self/fd/2 -> /dev/pts/0 lr-x------ 1 root root 64 Sep 6 20:33 /proc/self/fd/3 -> /var/lib/sss/mc/passwd lrwx------ 1 root root 64 Sep 6 20:33 /proc/self/fd/4 -> 'socket:[44829]' lr-x------ 1 root root 64 Sep 6 20:33 /proc/self/fd/5 -> /var/lib/sss/mc/group
#2 标准输出到另外一个xshell窗口
#3执行结果存起来,放到一个新文件中,比如这个发行版本
[root@centos8 ~]# lsb_release -i > os_releasion.txt [root@centos8 ~]# ls anaconda-ks.cfg os_releasion.txt reset.sh [root@centos8 ~]# cat os_releasion.txt Distributor ID: CentOS
#4 > 覆盖,把STDOUT重定向到文件
>> 追加
可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件
#5 hostname - I 本来的内容就是 本机的IP,显示正确,重定向到error.log肯定不行,只有错误信息才能写进去;
使用>>是追加,比如下面的 hostname 命令,我故意输错,结果就显示命令没找到 2>> 追加错误的结果,
2> 是覆盖错误,同一个error.log文件,只存入错误的信息,所以执行结果如果是对的信息就不放进去了;
此处只看到了错误提示信息:-bash :hostname : command not found
如下正确的信息就不存入了;2>>是追加错误的信息;
[root@centos7-kevin306 ~]# hostname 2>> error.log
centos7-kevin306.cn
#6举例:
正确信息和错误信息可以同时放一块显示出来
合并在一起写法:
#7范例:将标准输出和错误都重定向到同一个文件
#8多个命令的结果同时重定向到一个文件中
举例:下图是2个命令同时重定向;
#( pwd;hostname ) > all.log
#9举例运算 2*3
#10举例 rm 1 这种算是标准输出还是错误错误?正确的进a.txt,错误进b.txt,结果是b.txt;
一般地,提示报警这种信息也算是标准错误
#11 标准输入 bc
#12举例 计算100连加之和的结果
#13 cmd1 | cmd2 功能: 将cmd1的输出做为cmd2的输入
举例:100累加的结果直接管道符号传给bc执行,输出结果5050
管道符只支持标准输出,不支持标准错误
26 tr命令
tr 转换和删除字符
选项:
-d --delete:删除所有属于第一字符集的字符 -s --squeeze-repeats:把连续重复的字符以单独一个字符表示,即去重 -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符 -c –C --complement:取字符集的补集
#1把“a-z” 转换成"A-Z"
\n new line 换行 \r return 回车 \t horizontal tab
#2 删除换行符
#seq 10 |tr -d "\n" #删除换行符
#3换行符替换成空格
#seq 10 |tr "\n" " " #换行符替换成空格
#4 换行符号换成"+"号
#5 Windows格式转换成linux格式
5.1.利用cat创建文件;cat > linux.txt,输入abc
5.2.把linux文件转换成Windows文件(如果没有执行yum install dos2unix )
5.3.查看文件类型 file linux.txt
5.4.二进制方式查看 hexdump -C linux.txt 换行符0d
\r return 回车;\r 就是0d,也就是回车;
#5.5所以利用tr命令就可以删除;删除之后的结果再次重定向到a.txt文件中
tr -d "\r" < linux.txt >a.txt
#5.6 hexdumo查看结果,有还原成了linux格式的文件
27 tee
利用 tee 命令可以重定向到多个目标,经常配合管道符一起使用
#1 echo的结果打印出来,同时写入了tee.log中,如果tee.log不存在,会自动生成;
#2 如果tee.log文件已存在,则会覆盖tee.log的内容;
新的tee.log内容更新了。
#3 以上可以把命令1的STDOUT保存在文件中,做为命令2的输入
选项:-a 追加 #uname -r | tee -a tee.log
命令1 | tee [-a ] 文件名 | 命令2 ......
- a选项,内容追加成功,没有覆盖之前的内容
#4 创建配置文件test.conf,同时屏幕还需要显示,希望可以看到结果
------------------------------------------------------
211022 renew~