Linux 基础学习2
- 2019 年 10 月 8 日
- 笔记
目录
Linux 基础学习2
文件目录结构
- 文件和目录被组织成一颗倒置的树状结构
- 文件系统从根开始,“/”
- 文件名称严格区分大小写
- 隐藏文件以"."开头
- 路径的分隔符为"/"
文件命名规范
- 文件字符最长为255个字符
- 包括路径在内文件名称最长为4095个
- 颜色表示
- 蓝色文件 –> 目录
- 绿色文件 –> 可执行文件,可执行的程序
- 红色文件 –> 压缩文件或者包文件
- 浅蓝色文件 –> 链接文件,主要是使用
ln
命令建立的文件
- 白色文件 –> 一般性文件,如文本文件,配置文件,源码文件等
- 红色闪烁:表示链接的文件有问题
- 黄色:表示设备文件
- 灰色文件 –>其他文件
- 除了斜杠和NULL,其他所有字符都可以使用
- 对大小写敏感
文件系统结构
- /boot 引导文件的存放位置,内核文件、引导加载器都在此目录
- /bin 所有的用户都可以使用的命令
- /sbin 管理类的命令
- /lib 启动时程序使用的基本库文件 .so结尾
- /lib64 专门存放X86_64系统上得辅助库文件
- /etc 存放配置文件
- /home/USERNAME 普通用户的家目录
- /root 管理员的家目录
- /media 便携式移动设备的挂载点
- /mnt 临时文件的挂载点
- /dev 设备文件和特殊文件的存放位置
- /opt 第三方的应用的安装位置
- /tmp 临时文件的存放位置
- /usr 存放安装程序
- /var 存放经常变化的文件,比如日志
- /proc 存放内核启动和进程相关的虚拟文件
- /sys 输出当前系统上的硬件相关的文件
- /srv 系统上允许的服务用到的数据
linux应用程序的组成
- 二进制文件
- /bin
- /sbin
- /usr/bin
- /usr/sbin
- /usr/local/bin
- /usr/local/sbin
- 库文件
- /lib
- /lib64
- /usr/lib
- /usr/lib64
- /usr/local/lib
- /usr/local/lib64
- 配置文件
- /etc
- /etc/name
- /usr/local/etc
- 帮助文件
- /usr/share/man
- /usr/share/doc
- /usr/local/share/man
- /usr/local/share/doc
绝对路径和相对路径
- 绝对路径
- 以根开始
- 完整的文件的存放位置
- 可以读取到任何一个文件或者文件夹
- 相对路径
- 不以根开始
- 相对当前的位置来决定
- 可以简短的表示一个文件或者文件夹
- . 当前目录
- .. 父级目录
目录名和基名
[root@localhost log]#basename /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33 [root@localhost log]#basename /etc/sysconfig/network-scripts network-scripts [root@localhost log]#dirname /etc/sysconfig/network-scripts /etc/sysconfig [root@localhost log]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts
切换目录
cd 切换目录 change directory
- 可以使用相对路径
- 可以使用绝对路径
切换到家目录
[root@localhost log]#cd [root@localhost ~]#
切换到上一次的目录
[root@localhost ~]#cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]#cd - /root [root@localhost ~]#cd - /etc/sysconfig/network-scripts
显示当前的工作目录
pwd print working directory
[root@localhost network-scripts]#pwd /etc/sysconfig/network-scripts # 查看链接的真正目录 [root@localhost /]#cd lib [root@localhost lib]#pwd -P /usr/lib
列出目录或者文件
ls list
命令格式:Usage: ls [OPTION]… [FILE]…
ls -a 显示所有文件 [root@root ~]# ls -a . .cshrc file15 file3 .passwd.swo .. file1 file16 file4 .tcshrc anaconda-ks.cfg file10 file17 file5 teaching_plan.zip ls -l 以长格式显示文件列表 [root@root ~]# ls -l total 8 -rw-------. 1 root root 1414 Aug 22 2019 anaconda-ks.cfg -rw-r--r--. 1 root root 0 Mar 1 18:28 file1 -rw-r--r--. 1 root root 0 Aug 22 17:21 10 权限 硬盘的引用次数 属主 属组 大小 访问时间 文件名称 ls -R 递归显示目录 [root@root ~]# ls -R .: anaconda-ks.cfg file12 file16 file2 file5 file9 file1 file13 file17 file20 file6 teaching_plan.zip ls -d 显示目录本身 [root@root ~]# ls -d . ls -1(数字1) 文件分行显示 [root@root ~]# ls -1 anaconda-ks.cfg file1 file10 file11 file12 ls -S 安装文件大小排序 [root@root ~]# ls -S teaching_plan.zip file11 file15 file19 file4 file8 ls -r 倒序显示 [root@root ~]# ls -r teaching_plan.zip file6 file20 file17 file13 file1 ls -t 按照时间来排序 [root@root ~]# ls -t file18 file11 file15 file3 file7 teaching_plan.zip ls -lh 显示人类易读的方式 [root@root ~]# ls -1h anaconda-ks.cfg file1 file10 file11 file12 file13 ls -d */ 显示当前目录下的文件夹 l. 只显示隐藏文件 #修改文件创建时间 [root@root ~]# touch -c -m -t 201301211925 b19 [root@root ~]# ll b19 -rw-r--r--. 1 root root 0 Jan 21 2013 b19 #ls -l 等同于 ll [root@root ~]# ls -l b19 -rw-r--r--. 1 root root 0 Jan 21 2013 b19 [root@root ~]# ll b19 -rw-r--r--. 1 root root 0 Jan 21 2013 b19
linux下的目录类型
- – 用来表示文件
- d 用来表示目录
- b 块设备
- c 字符设备
- l 表示符号链接文件
- s socket套接字
查看文件状态
File: ‘anaconda-ks.cfg’ Size: 1747 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 33574992 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:admin_home_t:s0 Access: 2019-08-22 12:09:03.288000381 +0900 # 访问时间 Modify: 2019-08-22 11:47:12.262947345 +0900 # 修改时间 Change: 2019-08-22 11:47:12.262947345 +0900 # 改动时间 atime 访问时间 查看文件内容就会改变 mtime 修改时间 改变内容发生变化 ctime 改动时间 元数据发生变化
touch
创建空文件和刷新时间,如果文件存在,则刷新时间,如果文件不存在,则创建文件
-a 只修改atime和ctime
-m 只修改mtime和ctime
文件通配符
- * 所有
- ? 匹配的是任意单个字符
- ~ 表示用户的家目录
- [123] 其中一个
- [^123] 取反
- [0-9] 表示数字
- file[a-z] 字母(有坑)缺少Z
- file[A-Z] 字母(有坑)缺少a
- [:lower:] 小写字母
- [:upper:] 大写字母
- [:alpha:] 所有字母 a-zA-Z
- [:alnum:] 表示字母和数字
- [:digit:] 表示数字
创建目录
mkdir 创建目录
- -p 递归创建
- -v 显示详细过程
显示目录树
安装:yum install -y tree
tree 显示目录树
[root@root ~]# tree . ├── anaconda-ks.cfg ├── file1 ├── file10 ├── file11 ├── file12 ├── file13 ├── file14 ├── file15 ├── file16 ├── file17 ├── file18 ├── file19 ├── file2 ├── file20 ├── file3 ├── file4 ├── file5 ├── file6 ├── file7 ├── file8 ├── file9 └── teaching_plan.zip 0 directories, 22 files
-d 只显示文件夹
[root@root ~]# tree -d . 0 directories
-L # 只显示#层
[root@root ~]# tree -L 1 . ├── anaconda-ks.cfg ├── file1 ├── file10 ├── file11 ├── file12 ├── file13 ├── file14 ├── file15 ├── file16 ├── file17 ├── file18 ├── file19 ├── file2 ├── file20 ├── file3 ├── file4 ├── file5 ├── file6 ├── file7 ├── file8 ├── file9 └── teaching_plan.zip 0 directories, 22 files
删除目录
rmdir 只能删除非空目录
-p 递归删除空父目录
-v 显示删除过程
rm -rf 删除非空目录
复制文件和文件夹
cp copy 默认情况下是别名,原来本身命令是不提示覆盖的
Usage: cp [OPTION]... [-T] SOURCE DEST or: cp [OPTION]... SOURCE... DIRECTORY or: cp [OPTION]... -t DIRECTORY SOURCE... -i 显示提示信息 -n 不覆盖 -r -R 递归复制 -d 只复制链接文件,不复制源文件 -a 归档 -v 显示过程 -b 备份原来的文件 --backup=number 备份文件加上数字 -p 保留原来的属性
- 如果源文件是文件的话
- 目标是文件
- 目标文件如果不存在的话,则新建目标文件,并把内容写到目标文件中
- 如果目标文件存在的话,本来的命令是直接覆盖,建议使用-i来提示用户
- 目标是文件夹
- 在文件夹中新建一个同名的文件,并把文件内容写到新文件中
- 目标是文件
- 如果源文件为多个文件的话
- 目标必须是文件夹,文件夹必须存在,其他情况都会报错
- 如果源文件是文件夹的话
- 目标文件是文件: 不可以
- 目标文件必须是文件夹,必须使用-r选项
- 如果目标文件不存在:则直接创建目标文件夹,并把源文件夹的数据都复制到目标文件夹
- 如果目标文件存在:
- 如果是文件的话,则报错
- 如果是文件夹:则在目标文件夹中创建同名文件夹,并把所有数据都复制到新文件夹
移动、重命名
mv move
Usage: mv [OPTION]... [-T] SOURCE DEST or: mv [OPTION]... SOURCE... DIRECTORY or: mv [OPTION]... -t DIRECTORY SOURCE... -i 提示 -f 强制 -b 备份 --backup=number 备份后面加数字 -v 显示过程 #文件重命名示例 [root@root ~]# ls b111111 [root@root ~]# mv b111111 bbb233 [root@root ~]# ls bbb233
删除
rm remove
Usage: rm [OPTION]... FILE... -i 提示 -r -R 递归删除 -f 强制删除 rm -rf 慎用 rm -rf /* cd / rm -rf * 删除文件 [root@localhost bighome]# rm install.log 删除文件夹 [root@localhost ~]# rm -r b -f 省略确认步骤 [root@localhost ~]# rm -rf b 删除文件里面的内容 [root@localhost ~]# > filename [root@localhost ~]# > filename [root@localhost ~]# echo “” > filename [root@localhost ~]# echo > filename [root@localhost ~]# cat /dev/null > filename
链接
- 软链接
- 相当于windows的快捷方式
- 创建命令 ln -s 源文件 目标文件
- 可以对目录做软链接
- 指向另外的一个文件或者目录的路径,大小是路径的长度的字符
- 对磁盘引用次数没有影响
- 可以跨分区
- 源文件发生改变,软链接会跟着发生变化
- 源文件删除,软链接不能访问
- 硬链接
- 磁盘引用次数会发生变化
- 指向的是硬盘上的同一块区域
- 磁盘的引用数会随着硬链接次数来增加
- 不能对目录做硬链接
- 不能跨越分区
- 源文件发生改变,硬链接也会跟着变化
- 源文件删除以后,硬链接可以访问
查看文件类型
file
输入和输出
- 标准输入 默认是来自键盘的输入 stdin 0
- 标准输出 默认输出到终端窗口 stdout 1
- 标准错误输出 默认输出到终端窗口 stderr 2
I/O重定向
> 覆盖
- > 将标准输出重定向到文件中
- 2> 将错误输出重定向到文件中
- &> 将所有的输出都重定向到文件中
禁止、允许覆盖
- 禁止覆盖 set -C
- 允许覆盖 set +C
>> 追加
>> 将标准输出追加到文件中
2>> 将错误输出追加到文件中
&>> 将所有输出追加到文件中
标准输入和错误输入分开保存
[root@localhost ~]#ls f 45yuio > log.log 2> error.log [root@localhost ~]#cat log.log f [root@localhost ~]#cat error.log ls: cannot access 45yuio: No such file or directory
合并所有的输出
- &> 覆盖重定向
- &>> 追加重定向
- command > file 2>&1
- command >> file 2>&1
- ():合并多个文件的输出
- /dev/null 黑洞
从文件导入stdin
tr 字符替换
-t 截断 -d 删除 -s 压缩,去重 -c 取反 [root@localhost ~]#tr 'a-z' 'A-Z' < /etc/issue S KERNEL R ON AN M [root@localhost ~]#tr 'a-z' 'A-Z' qwertyy QWERTYY 12345678 12345678 ASDFGHJ ASDFGHJ qwertyuio QWERTYUIO ^C [root@localhost ~]#tr ab 12 ab 12 abb 122 asdfghjkl 1sdfghjkl ^C [root@localhost ~]#tr abc 12 ab 12 abc 122 abc 122 ^C [root@localhost ~]#tr ab 123 ab 12 abb 122 avc 1vc qbc q2c abc 12c [root@localhost ~]#tr -t abc 12 abc 12c ab 12 [root@localhost ~]#tr -d abc qwertyui qwertyui an^H^H n abc artyibrtyuiocrtyuiop rtyirtyuiortyuiop ^C [root@localhost ~]#tr -d abc < /etc/issue S Kernel r on n m [root@localhost ~]#cat /etc/issue S Kernel r on an m [root@localhost ~]#tr -s a abc abc aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc abc ^C [root@localhost ~]#tr -sc a aasdaaaaaaa aasdaaaaaaa ^[[A^H^H^C [root@localhost ~]#tr -sc a aaaaaaaaabbbbbbbbbbbbbccccccccddddddddddd aaaaaaaaabcd [root@localhost ~]#tr -dc a aaaaaaaaaaaabbbbbbbbbb asdfghjkqwertyuiozxcvbnmxcvbnm,. aaaaaaaaaaaaa ctrl+d 结束 [root@localhost ~]#tr -dc "an" asdfghjk a wertyujk;l' asdfghj a [root@localhost test]#tr -d a < issue > issue 处理完成以后不能写会到源文件,要写到新的文件中 [root@localhost test]#seq 1 10 > b [root@localhost test]#cat b 1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr -d "n" < b 12345678910[root@localhost test]#tr -d "n" < b [root@localhost test]#tr "n" " " <b 1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr "n" " " <b >c [root@localhost test]#cat c 1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr " " "n" <c 1 2 3 4 5 6 7 8 9 10
多行发送给stdin
# 第一种方式 [root@localhost test]#cat > f1 qwert wertyui wertyui wertyuiopasdfghjk sdfghjkl sdfyhjkl;sdfghjkl;xcvb # 第二种方式 [root@localhost test]#cat > f2 <<EOF > qwerty > qwertyu > wertyui > qwertyu > EOF EOF 不是必须得,只要两个相同就可以
管道
管道使用“|”来表示
命令1|命令2|命令3
- 把命令1的输出结果当做命令2的输出结果,把命令2的输出结果当成命令3的输入结果
- 默认情况下,管道只能传送标准输出
- 如果需要把错误输出也传递,则需要|&
- 一般用来组合多个命令
- 有一些命令是不接受管道的
[root@localhost test]#ls f1|tr 'a-z' 'A-Z' F1 [root@localhost test]#ls f ls: cannot access f: No such file or directory [root@localhost test]#ls f|tr 'a-z' 'A-Z' ls: cannot access f: No such file or directory [root@localhost test]#ls f|&tr 'a-z' 'A-Z' LS: CANNOT ACCESS F: NO SUCH FILE OR DIRECTORY [root@localhost test]#echo file{1..20}|touch touch: missing file operand Try 'touch --help' for more information.
作 者:郭楷丰