Kevin_306

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~

posted on 2021-01-18 02:57  熊猫小虾  阅读(170)  评论(0编辑  收藏  举报

导航