Linux文件管理和 I/O 重定向
Linux文件系统目录结构
常见目录说明:
-
/:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。
-
/bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
-
/boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。
-
/dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。
-
/etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
-
/home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,表示当前用户的家目录,edu 表示用户 edu 的家目录。
-
/lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
-
/lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。
-
/mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
-
/opt:给主机额外安装软件所摆放的目录。
-
/proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。
-
/root:系统管理员root的家目录。
-
/sbin: /usr/sbin: /usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root使用的命令,一般用户只能"查看"而不能设置和使用。
-
/tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
-
/srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。
-
/usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录。
-
/var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。
说明:
- 文件和目录被组织成一个单根倒置树结构
- 文件系统从根目录下开始,用“/”表示
- 根文件系统(rootfs): root filesystem
- 标准Linux文件系统(如: ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAilL
- 以 . 开头的文件为隐藏文件
- 路径分割的 /
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 蓝色–> 目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其它文件
- 每个文件都有两类相关数据:元数据:metdata,即属性,数据:data,即文件内容。
Linux下的文件类型
- 普通文件
d 目录文件directory
| 符号1链接文件link
b 块设备block
c 字符设备character
p 管道文件pipe
s 套接字文件socket
范例:
[root@Centos7 ~]# ls -l /run/
-rw-r--r-- 1 root root 4 Aug 10 13:25 acpid.pid
srw-rw-rw- 1 root root 0 Aug 10 13:25 acpid.socket
-rw-r--r-- 1 root root 5 Aug 10 13:27 atd.pid
-rw-r--r-- 1 root root 5 Aug 10 13:26 crond.pid
---------- 1 root root 0 Aug 10 13:25 cron.reboot
drwx------ 2 root root 40 Aug 10 13:25 cryptsetup
drwxr-xr-x 2 root root 60 Aug 10 13:25 dbus
-rw-r--r-- 1 root root 4 Aug 10 13:25 dhclient-eth0.pid
prw------- 1 root root 0 Aug 10 13:25 dmeventd-client
prw------- 1 root root 0 Aug 10 13:25 dmeventd-server
-rw------- 1 root root 0 Aug 10 17:01 ebtables.lock
drwxr-xr-x 2 root root 40 Aug 10 13:25 faillock
-rw-r--r-- 1 root root 5 Aug 10 13:26 lvmetad.pid
drwxr-xr-x 2 root root 40 Aug 10 13:25 mount
drwxr-xr-x 2 root root 40 Aug 10 13:25 setrans
-rw-r--r-- 1 root root 5 Aug 10 13:25 sshd.pid
-rw-r--r-- 1 root root 5 Aug 10 13:26 stargate.tencentyun.pid
drwx--x--x 3 root root 60 Aug 10 13:25 sudo
-rw------- 1 root root 4 Aug 10 13:26 syslogd.pid
drwxr-xr-x 17 root root 440 Aug 10 17:01 systemd
-rw-r--r-- 1 root root 4 Aug 10 13:25 tat_agent.pid
drwxr-xr-x 2 root root 60 Aug 10 13:25 tmpfiles.d
drwxr-xr-x 3 root root 60 Sep 7 20:50 user
-rw-rw-r-- 1 root utmp 2304 Sep 14 21:07 utmp
-rw------- 1 root root 0 Aug 10 13:26 xtables.lock
drwxr-xr-x 3 root root 60 Aug 10 13:26 ydeyes
-rw-r--r-- 1 root root 0 Aug 10 13:25 YDLive.pid
-rw-r--r-- 1 root root 4 Aug 10 13:26 YDService.pid
文件操作命令
显示当前工作目录
每个shell和系统进程都有一个当前的工作目录 CWD:current work directory
显示当前shell CWD的绝对路径
pwd命令:printing working directory
- -P 显示真实物理路径
- -L 显示链接路径(默认)
范例:
[root@Centos7 ~]# cd /opt/
[root@Centos7 opt]# pwd
/opt
[root@Centos7 opt]# pwd -P
/opt
[root@Centos7 opt]# cd /bin/
[root@Centos7 bin]# pwd
/bin
[root@Centos7 bin]# pwd -P
/usr/bin
[root@Centos7 bin]#
绝对和相对路径
-
绝对路径
以正斜杠 / 即根目录开始
完整的文件的位置路径
可用于任何想指定一个文件名的时候
-
相对路径
不以任何斜杠开始
一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相于某目录的位置可以作为一个简短的形式指定一个文件名
基名:
用户目录
位于/home/user,称之为用户的工作目录或家目录。表示方式:
/home/user
~
从 / 目录开始描述的路径为绝对路径,如:
cd /home
ls /usr
从当前位置开始描述的路径为相对路径,如:
cd ../../
ls abc/def
每个目录下都有**.和…**
. 表示当前目录
… 表示上一级目录,即父目录
根目录下的.和…都表示当前目录
文件的颜色 | 含义 |
---|---|
蓝色 | 目录 |
绿色 | 可执行文件 |
红色 | 压缩文件 |
浅蓝色 | 链接文件 |
灰色 | 其他文件 |
软硬链接
硬链接(hard)
硬链接本质是给一个文件起个新名称,实质是同一个文件。
硬链接特性
- 创建硬链接会对对应的目录中增加额外的记录项以引用文件
- 对应于同一个文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨驱动器或分区
- 不支持对目录创建硬链接
格式:
ln filename [linkname]
软链接
一个符号链接指向另一个文件,就像windows中快捷方式,软链接文件和原文件本质上不是同一个文件软链接特点。
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 在创建软链接时,如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目录,但是软链接的路径如果是相对路径,则是相对于当前工作目录
格式:
ln -s filename [linkname]
范例:
# 绝对路径
ln -s /date/dir /data/dirlink
# 相对路径
cd /data
ln -s ../data/dir /root/dirlink
rm -rf /data/dirlink #删除软连接本身不会,删除源目录内容
rm -rf /data/dirlink #删除硬链接目录的文件,不会删除链接文件
# 查看链接文件指向的原文件
readlink /data/dirlink
硬链接和软链接的区别
-
本质:
硬链接:本质是同一个文件
软连接:本质不是同一个文件
-
inode
硬链接:相同
软链接:不相同
-
文件夹
硬链接:不支持
软链接:支持
-
相对路径
硬链接:原始文件相对路径是相对于当前工作目录
软链接:原始文件的相对路径是相对于链接文件的相对路径
-
文件类型
硬链接:和源文件相同
软链接:源文件的路径的长度
IO重定向和管道
标准输入和输出
程序:指令 + 数据
读入数据:input
输出数据:Output
打开的文件都有一个fd:fine descriptor(文件描述符)
Linux给程序提供三种 I/O 设备
-
标准输入(STDIN):-0 默认接受来自终端窗口的输入
-
标准输出(STDOUT):-1 默认输出到终端窗口
-
标准错误(STDERR): -2 默认输出到终端窗口
实例:文件描述符
[root@ouou ~]# ls /opt/
b containerd mellanox rh
[root@ouou ~]# ls /opt/aaha*
ls: cannot access /opt/aaha*: No such file or directory
I/O重定向 redirect
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标。
标准输出和错误重新定向
STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端。
格式:
命令 操作符号 文件名
支持的操作符号包括:
1> 或 > 把标准输入重定向到文件
2> 把标准输出重定向到文件
&> 把标准输入和输出都重定向
以上如果文件已存在,文件内容会被覆盖
set -c 禁止将内容覆盖已有文件,但可追加, 利用 >| 仍可强制覆盖。
set +c 允许覆盖,默认。
追加
>> 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件
>> 追加标准输出重定向至文件
2 >> 追加标准错误重定向至文件
标准输出和错误各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/toerror.out
合并标准输入和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2&1
合并多个程序
(CMD1;CMD2…)或者{CMD1;CMD2;…;}合并多个程序的STDOUT
范例:
ls 1> /opt/test
范例:标准错误重定向
rm /data/f1.log 2> /data/all.log
范例:清除大文件
cat /dev/null > /data/file.log
> /data/file.log
范例:分别重定向
ls /data /xxx > stdout.log 2> stderr.log