linux中一切皆文件。
查找可执行命令在哪里which ls
文件目录结构
- 文件和目录被组织成一颗倒置的树状结构
- 文件系统从根“/”开始,
- 文件名称严格区分大小写
- 隐藏文件以"."开头
- 路径的分隔符为"/"
文件命名规范
- 文件字符最长为255个字符
- 包括路径在内文件名称最长为4095个
- 颜色表示
- 蓝色 ---> 文件夹
- 绿色 --> 可执行文件
- 红色 --> 压缩文件
- 蓝绿色 --> 链接文件,在Windows中快捷方式就是一个连接文件
- 灰色-->其他文件
- 白色 --> 文件
- 除了斜杠和NULL,其他所有字符都可以使用
- 对大小写敏感
文件系统结构
- /boot 引导文件的存放位置,内核文件、引导加载器都在此目录
- /bin 所有的用户都可以使用的命令
- /sbin 管理类的命令
- /lib 启动时程序使用的基本库文件,一般情况以 .so结尾
- /lib64 专门存放X86_64系统上得辅助库文件
- /etc 存放配置文件
- /home/USERNAME 普通用户的家目录
- /root 管理员的家目录
- /media 便携式移动设备的挂载点,与Windows的盘符相似。
- /mnt 临时文件的挂载点
- /dev 设备文件和特殊文件的存放位置
- /opt 第三方的应用的安装位置
- /tmp 临时文件的存放位置,系统重启或间隔一定的时间就清空文件夹。
- /usr 存放安装程序
- /var 存放经常变化的文件,比如日志/var/log
- /proc 存放内核启动和进程相关的虚拟文件
- /sys 输出当前系统上的硬件相关的文件
- /srv 系统上允许的服务用到的数据
linux应用程序的组成
- 二进制文件
- /bin
- /sbin
- /usr/bin
- /usr/sbin
- /usr/local/bin
- /usr/local/sbin
如:
[root@localhost ~]# which top
/usr/bin/top
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
- 库文件
- /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 ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#
- 相对路径
- 不以根开始
- 相对当前的位置来决定
- 可以简短的表示一个文件或者文件夹
- . 当前目录
- .. 父级目录
如:
[root@localhost /]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cd ..
[root@localhost sysconfig]# cd ..
[root@localhost etc]# cd ../var/log
[root@localhost log]# cd /usr/sbin/
[root@localhost sbin]# cd ../../var/log
目录名和基名
dirname
显示父级目录
[root@localhost log]# dirname /etc/sysconfig/network-scripts/
/etc/sysconfig
basename
显示目录中最后一个文件/文件夹名
[root@localhost log]# basename /etc/sysconfig/network-scripts/ifcfg-ens33
ifcfg-ens33
[root@localhost log]# basename /etc/sysconfig/network-scripts
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
# lib是一个链接文件
[root@localhost lib]# pwd
/lib
# 查看链接的真正目录
[root@localhost lib]# pwd -P
/usr/lib
列出目录或者文件
ls 全称:list
命令格式:Usage: ls [OPTION]… [FILE]…
ls -a 显示所有文件
ls -l 以长格式显示文件列表,简写 ll
total 21104 # 属主:所有者 属组:所有者的组
-rw-------. 1 root root 1384 Aug 5 15:45 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 Aug 5 15:47 Desktop
权限 硬盘的引用次数 属主 属组 大小 访问时间 文件名称
ls -R 递归显示目录
ls -d 显示目录本身
ls -1(数字1) 文件分行显示
ls -S 安装文件大小排序
ls -r 倒序显示
ls -t 按照时间来排序
ls -lh 显示人类易读的方式
ls -d */ 显示当前目录下的文件夹
l. 只显示隐藏文件
具体详情请执行 ls --help查看
linux下的目录类型
[root@localhost ~]# ls -lut 倒叙显示
total 21104
drwxr-xr-x. 2 root root 6 Aug 5 15:47 Desktop
-rw-------. 1 root root 1384 Aug 5 15:45 anaconda-ks.cfg
第一个字符,目录类型
- - 用来表示文件
- d 用来表示目录
- b 块设备
- c 字符设备
- l 表示符号链接文件
- s socket套接字
查看文件状态
[root@localhost ~]# stat anaconda-ks.cfg 查看文件信息
File: anaconda-ks.cfg
Size: 1384 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 36136117 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) # 用户信息
Context: system_u:object_r:admin_home_t:s0
Access: 2020-08-05 15:46:48.020026730 +0800 # 访问时间
Modify: 2020-08-05 15:45:49.601936137 +0800 # 修改时间
Change: 2020-08-05 15:45:49.601936137 +0800 # 改动时间
Birth: -
atime 访问时间 查看文件内容就会改变 一个小时内的多次访问
mtime 修改时间 改变内容发生变化
ctime 改动时间 元数据发生变化
touch
创建空文件和刷新时间,如果文件存在,则刷新时间,如果文件不存在,则创建文件
-a 只修改atime和ctime
-m 只修改mtime和ctime
注意:创建空目录:mkdir
[root@localhost test]# ls # 按照ASIIC码展开
file filea filed fileg filej filem filep files filev filey
'file[' fileA fileD fileG fileJ fileM fileP fileS fileV fileY
file] fileb filee fileh filek filen fileq filet filew filez
'file^' fileB fileE fileH fileK fileN fileQ fileT fileW fileZ
file_ filec filef filei filel fileo filer fileu filex
'file`' fileC fileF fileI fileL fileO fileR fileU fileX
文件通配符
- * 所有
- ? 匹配的是任意单个字符
- ~ 表示用户的家目录
- [123] 其中一个
- [123] 取反
[root@localhost test]# ls file[^abc] 取反
'file[' 'file`' fileD fileH fileL fileP fileT fileX
file] fileA fileE fileI fileM fileQ fileU fileY
'file^' fileB fileF fileJ fileN fileR fileV fileZ
file_ fileC fileG fileK fileO fileS fileW
- [0-9] 表示数字
- file[a-z] 大小写字母,缺少Z
[root@localhost test]# ls file[a-d]
filea fileA fileb fileB filec fileC filed
[root@localhost test]# ls file[abcd]
filea fileb filec filed
- file[A-Z] 大小写字母,缺少a
[root@localhost test]# ls file[A-D]
fileA fileb fileB filec fileC filed fileD
- [:lower:] 小写字母
[root@localhost test]# ls file[:lower:] # 小写字母
filee filel fileo filer filew
[root@localhost test]# ls file[[:lower:]] # 小写字母中的任何一个
filea filed fileg filej filem filep files filev filey
fileb filee fileh filek filen fileq filet filew filez
filec filef filei filel fileo filer fileu filex
- [:upper:] 大写字母
- [:alpha:] 所有字母 a-zA-Z
[root@localhost test]# ls file[:alpha:]
filea fileh filel filep
[root@localhost test]# ls file[[:alpha:]]
filea fileC filef fileH filek fileM filep fileR fileu fileW filez
fileA filed fileF filei fileK filen fileP files fileU filex fileZ
fileb fileD fileg fileI filel fileN fileq fileS filev fileX
fileB filee fileG filej fileL fileo fileQ filet fileV filey
filec fileE fileh fileJ filem fileO filer fileT filew fileY
- [:alnum:] 表示字母和数字
- [:digit:] 表示数字
创建目录
mkdir 创建目录
mkdir test
- -p 递归创建
mkdir -p a/b/c/d
- -v 显示详细过程
[root@localhost test]# mkdir -pv a/c/d/f
mkdir: created directory 'a'
mkdir: created directory 'a/c'
mkdir: created directory 'a/c/d'
mkdir: created directory 'a/c/d/f'
显示目录树
安装:yum install -y tree
tree . 显示目录树
[root@localhost test]# mkdir -p a/c/d/f
[root@localhost test]# touch file{a..c}
[root@localhost test]# tree .
.
├── a
│ └── c
│ └── d
│ └── f
├── filea
├── fileb
└── filec
-d 只显示文件夹
tree -d .
-L # 只显示#层
tree -dL 2 .
删除目录
rmdir 只能删除非空目录
-p 递归删除空父目录
rmdir -p a/c/d/f
-v 显示删除过程
rm -rf 删除非空目录
rm -rf * 删除全部
复制文件和文件夹
cp copy 默认情况下是别名cp -i
,原来本身命令是不提示覆盖的。执行本身的命令cp
。
Usage: cp [OPTION]... [-T] SOURCE DEST
or: cp [OPTION]... SOURCE... DIRECTORY
or: cp [OPTION]... -t DIRECTORY SOURCE...
-i 显示提示信息
-n 不覆盖
-r -R 递归复制
cp -r /etc/ . 复制/etc到当前目录下
-d 只复制链接文件,不复制源文件
-a 归档,同-dR
-v 显示过程
-b 先备份原来的文件再复制,备份文件的名后增加~
--backup=number 备份文件并加上数字
-p 保留原来的属性,默认cp后的属性为root
-f 并不是真正的强制复制
cp file1 file2 复制file1,命名为file2
- 如果源文件是单个文件:
- 目标是文件:
- 目标文件如果不存在,则新建目标文件,并把内容写到目标文件中
- 如果目标文件存在,本来的命令是直接覆盖,建议使用-i来提示用户
- 目标是文件夹:
- 在文件夹中新建一个同名的文件,并把文件内容写到新文件中
- 目标是文件:
- 如果源文件为多个文件,
cp file1 file2 f3
- 目标必须是文件夹,文件夹必须存在,其他情况都会报错
- 如果源文件是文件夹
- 目标文件必须是文件夹,必须使用-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@localhost test]# mv filea f1 将filea重命名为f1
[root@localhost test]# mv f1 a 将filea移动至a文件夹中
[root@localhost test]# mv f1 f2 ../ 移动多个文件
删除文件
rm remove
Usage: rm [OPTION]... FILE...
-i 提示
-r -R 递归删除
-f 强制删除
rm -rf 慎用
rm -rf * 删除所有的
rm -rf /* 删除根目录下的所有文件 rm -rf /不可用 ,可在虚拟机中创建快照以保持当前的状态再试看执行危险的命令。
链接
软链接
- 相当于windows的快捷方式
- 创建命令
ln -s 源文件 目标文件
- 可以对目录做软链接
- 指向另外的一个文件或者目录的路径,因此对磁盘引用次数没有影响,大小是路径的长度的字符个数
- 可以跨分区
- 源文件发生改变,软链接会跟着发生变化
- 源文件删除,删除了文件的引用关系,软链接不能访问
硬链接
创建命令
ln 源文件 目标文件
磁盘引用次数会发生变化
指向的是硬盘上的同一块区域,因此磁盘的引用数会随着硬链接次数来增加
由于硬链接直接执向数据,所以不能对目录做硬链接
不能跨越分区
源文件发生改变,硬链接也会跟着变化
源文件删除以后,删除只是删除文件的引用关系,硬链接可以访问
查看文件类型
file 目标名称
输入和输出
- 标准输入 默认是来自键盘的输入 stdin 用数值表示为 0
- 标准输出 默认输出到终端窗口 stdout 1
- 标准错误输出 默认输出到终端窗口 stderr 2
I/O重定向
> 覆盖
[root@localhost test]# cat file
abcde
[root@localhost test]# echo "haha" > file # 覆盖
[root@localhost test]# cat file
haha
- > 将标准输出重定向到文件中,相当于1>
- 2> 将错误输出重定向到文件中
- &> 将所有的输出都重定向到文件中
禁止、允许覆盖
- 禁止覆盖 set -C
- 允许覆盖 set +C
[root@localhost test]# set -C
[root@localhost test]# echo "haha" > file
-bash: file: cannot overwrite existing file
>> 追加
- >> 将标准输出追加到文件中,相当于1>>
- 2>> 将错误输出追加到文件中
- &>> 将所有输出追加到文件中
[root@localhost test]# cat file
haha
[root@localhost test]# echo "haha" >> file
[root@localhost test]# cat file
haha
haha
标准输入和错误输入分开保存
[root@localhost ~]#ls test error_file > log.log 2> error.log
>即是1>,将正确信息保存在log.log中,错误信息保存在error.log中
[root@localhost ~]#cat log.log
f
[root@localhost ~]#cat error.log
ls: cannot access error_file: No such file or directory
若有文件则按规则更改,若无文件则会创建文件。
合并所有的输出
- &> 覆盖重定向
- &>> 追加重定向
- command > file 2>&1 标准输出写入file中,错误输出也输入file中,但现在不常用了。
- command >> file 2>&1
- ():合并多个文件的输出
[root@localhost /]# (ls error_file1;ls error_file2) 2>error_file
- /dev/null 回收站、黑洞,能够无限的接受文件,不需要删除。
[root@localhost /]# (ls errorfile1; ls errorfile2) &>/dev/null
- /dev/zero ”白洞“,一直往外”吐“。
可测试硬盘的速度
创建两个文件:
[root@localhost test]# dd if=/dev/zero of=j bs=100M count=2
2+0 records in
2+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.684107 s, 307 MB/s
[root@localhost test]# ll -h j
-rw-r--r--. 1 root root 200M Aug 6 15:47 j
从文件导入stdin
tr 字符替换
-t 截断
-d 删除
-s 压缩,去重
-c 取反
[root@localhost test]# cat /etc/issue
S
Kernel
on an m
[root@localhost ~]#tr 'a-z' 'A-Z' < /etc/issue # 替换,<从文件读入
S
KERNEL R ON AN M
# 可接受键盘串来的数据
[root@localhost ~]#tr 'a-z' 'A-Z'
qwertyy
QWERTYY
[root@localhost ~]#tr ab 12
ab
12
abb
122
[root@localhost ~]#tr abc 12
ab
12
abc # 以第一个被替换参数为主,若第一个参数多,则以第二个替换参数的最后一个字符替换多余的参数
122
[root@localhost ~]#tr ab 123
ab # 若第二个替换参数多,则忽略最后多出的参数。
12
abb
122
[root@localhost ~]#tr -t abc 12
abc # -t,截断,以第二个替换参数为主,不替换多余的参数
12c
ab
12
[root@localhost ~]#tr -d abc
abc # -d 删除出现的字符
abcde
de
[root@localhost ~]#tr -s a
aaaaaaaaabc # -s 去重
abc
[root@localhost ~]#tr -sc a
aaaaabbbbccccdddd # -c 取反
aaaaabcd
[root@localhost ~]#tr -dc a
aaabbbbb # 除了a全部删除,b后的空格也删除了,需要ctrl+d才能显示结果。
# ctrl+d 结束
aaa
# 避免此情况可加换行符
[root@localhost ~]#tr -dc "a
"
asdfghjk
a
[root@localhost test]#tr -d a < file > file 处理完成以后不能写回到源文件,要写到新的文件中,不然原文件内容就会被清空
[root@localhost test]#tr -d a < file > file1
[root@localhost test]#seq 1 5 > b
[root@localhost test]#cat b
1
2
3
4
5
[root@localhost test]#tr -d "
" < b
12345
[root@localhost test]#tr "
" " " <b
1 2 3 4 5 [root@localhost test]#tr "
" " " <b >c
[root@localhost test]#cat c
1 2 3 4 5 [root@localhost test]#tr " " "
" <c
1
2
3
4
多行发送给stdin
# 第一种方式,输入后回车即写入文件
[root@localhost test]#cat > f1
'''
输入内容,ctrl+c结束输入
'''
# 第二种方式,输入完成后才写入文件
[root@localhost test]#cat > f2 <<EOF
'''
> 输入内容
> EOF # 结束输入
'''
EOF:不是必须写EOF,写任意字符都行,但结尾一定要和开头相同。
管道
管道使用“|”来表示
命令1|命令2|命令3
- 把命令1的输出结果当做命令2的输入结果,把命令2的输出结果当成命令3的输入结果
- 默认情况下,管道只能传送标准输出
- 如果需要把错误输出也传递,则需要|&
- 一般用来组合多个命令
- 有一些命令不支持管道,如:touch、cat等。
[root@localhost test]#ls f1|tr 'a-z' 'A-Z'
F1
[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.
cat 显示文本
-E 显示结尾的$符
-n 对显示的每一行进行编号
-b 对非空行进行编号
-s 对连续的空行进行压缩
tac :与cat相反倒序显示
less 分屏显示文本
- 向下翻一屏:空格
- 向下翻一行:回车
- 退出:q
- 搜索文本:/ 文本
- n 向下查找;N向上查找
less 是man命令的默认分页器
more 分页显示文件
默认情况下显示读取的百分比
读取完成自动退出
q 退出
-d 显示翻屏和退出的提示
显示文件的前、后面的内容
head显示文件的前面的内容;tail 显示文件的后面的内容:
默认显示10行
-#
显示前#行,同-n #
显示前#行。-c #
显示前#个字符,换行符也是一个字符
cut 切割
cut OPTION... [FILE]...
cp /ect/passwd .
-c 按照字符切割
tail passwd |cut -c2-5 切割第2-5个字符
-d 指定切割符,默认是tab
-f # 显示切割后的第#个字段
#,#,# 显示离散的多个
#-# 表示连续的
1-5,7 可以结合使用
tail passwd |cut -d: -f1-5,7
tail passwd |cut -d: -f1-5
tail passwd |cut -d: -f1,3,5 以
paste 合并
默认是相同行合并到一起,默认是tab键
执行合并连接间隔符:-d
-s 将所有的行按照列来显示
paste a.txt b.txt
paste -d: a.txt b.txt
paste -s a.txt b.txt
wc 用来对文本进行统计
word count
[root@localhost test]#wc b.txt
4 5 20 b.txt
行数 单词数 字节数 文件名
-l 只显示行数
-w 只显示单词数 默认以空格(即使是中文)分隔的为一个单词
-c 只显示字节数
-m 只显示字符数
-L 显示文件中最长行的字符个数
sort 排序
Usage: sort [OPTION]... [FILE]...
or: sort [OPTION]... --files0-from=F
- 默认是按照字母排序
- -r 倒序
- -R 随机排序
- -n 按照数字排序
- -f 忽略大小写
- -t 指定分隔符
- -k # 指定按照第#个字段进行排序
sort -t: -k3 passwd
sort -nt" " -k3 passwd a按照空格
uniq合并相同的行
- 相邻
- 完全一样
-c 显示相同的行出现的次数
-d 只显示重复的行
-u 显示从没有重复过的行
diff 对比文件
[root@localhost test]cp d f
[root@localhost test]#echo "123" >> f
[root@localhost test]#diff d f
11a12 行数 a 行数 a:add
> 123
[root@localhost test]#echo "1234" >> d
[root@localhost test]#diff d f
12c12 行数 c 行数 c:change
< 1234
---
> 123
chown 用来修改所有者和组
Usage: chown [OPTION]... [OWNER][:[GROUP]] FILE...
or: chown [OPTION]... --reference=RFILE FILE...
chown haha c 修改文件c的属主
chown haha:haha c 修改属主和属组
chown root.root c 同上一个
chown :haha c 直接属组
chown -R haha test 递归修改文件夹test中所有文件的属主
chown --reference=c d 按照文件c的所有者和组修改文件d
chgrp 修改文件的属组
Usage: chgrp [OPTION]... GROUP FILE...
or: chgrp [OPTION]... --reference=RFILE FILE...
权限
[root@localhost test]# ll
total 4
-rw-r--r--. 1 root root 9 Aug 6 16:37 f1
第一位表示文件种类,后九位表示权限
9位表示权限,分3组,3位表示一组,--- --- ---
。
--- --- ---
第一位 第二位 第三位
属主的权限(u) 属组的权限(g) 其它的权限(o) 全部(a)
a:all
修改权限
chmod 可以直接修改某一类用户的权限
[root@localhost test]# chmod u+x f1 修改f1属主的权限
[root@localhost test]# ll
total 4
-rwxr--r--. 1 root root 9 Aug 6 16:37 f1
chmod u+x f1 增加
chmod u-x f1 删除
chmod u=r f1 直接赋值
每个文件的权限
r 读
w 写
x 执行
对于文件来说
- r 可以使用文本查看工具来查看里面的内容
- w 可以修改文本的内容
- x 执行可以直接
./file
对于目录来说
- r 可以使用ls等文件查看的命令查看
- w 可以创建文件,也可以删除
- x 可以cd进入
可以直接使用数字表示,有则为1无则为0
--x :001,转换为8进制:1
-w- :010,2
r-- :100, 4
rw- :110,6
rwx :111,7
r-x :101,5
-wx :011,3
chmod 775 f1
可以基于某个文件来修改
chmod --reference=c d 按照文件c的权限修改文件d
设定特殊权限
lsattr 查看属性(若被黑客攻击却不能删除病毒文件,可查看这个特殊权限)
[root@localhost test]# lsattr f1
-------------------- f1
chattr 设置属性
chattr +i 不能删除、不能修改、不能变更。
chattr -i
chattr +a 只能追加数据
chattr -a
编写python脚本执行简单的打印操作:
[root@localhost test]# vim test.py
# 输入的内容:
#!/bin/python3 # 设置shabang,即解释器,系统默认为bash,which python3 可查看要具体设置的python路径,/usr是个链接,因此可以省去不写。
#coding:utf-8 # 设置编码
print("停车坐爱枫林晚,霜叶红于二月花")
:qw #退出保存
# 设置test.py的可执行权限
[root@localhost test]# chmod a+x test.py
# 执行test.py文件
# 方式一:若未设置解释器路径则会报错。
[root@localhost test]# ./test.py
停车坐爱枫林晚,霜叶红于二月花
# 方式二:
[root@localhost test]# python3 test.py
停车坐爱枫林晚,霜叶红于二月花