文件管理
一、Linux基础命令
1. 通配符
去匹配文件名(包括目录)
| 符号 | 效果 |
|---|---|
| ? | 匹配一个字符 f?.txt |
| * | 匹配所有非隐藏的字符无论多长多短,但不匹配 "." 开头的文件,即隐藏文件 |
| {1..10} | 1到10 |
| {a..z} | a b c ...z |
| {A..Z} | A B C .....Z |
| [123] | 包含其中之一就显示,没有也无所谓(此处括号里只表示单个字符) |
| [0-9] | 匹配数字范围(0123456789),表示单个数字 |
| [a-z] | 范围需要注意 (表示从aA、bB到z,不含Z),表示单个字母 |
| [A-Z] | 从A到Z(只含大写)中的任意一个字母 |
| \ | 转义符,表示原来的意思 |
| [[:lower:]] | 小写字母表示 a-z |
| [[:upper:]] | 大写字母表示 A-Z |
| [^zhou] | 匹配列表中的所有字符以外的字符 |
| [[:digit:]] | 任意数字,相当于0-9 |
示例:
1)*的使用。
[root@localhost data]# ls -a * //不显示隐藏文件
1
[root@localhost data]# ls -a //显示隐藏文件
. .. 1
[root@localhost data]# ls * //*不包括.开头的
ls: 无法访问*: 没有那个文件或目录
[root@localhost data]# ls .* //包括了 .. 上层目录
.:
..:
aaa boot dev home lib64 misc net proc run sdb1 sys usr
bin data etc lib media mnt opt root sbin srv tmp var
2)使用{a..z}和{A..Z},[a-z]和[A-Z]。大小写字母的区别比较。
[root@localhost data]# touch f{a..z}.log
[root@localhost data]# touch f{A..Z}.log
[root@localhost data]# ls
123456.txt fa.log fe.log fj.log fo.log ft.log fy.log
123.txt f{A.Z}.log ff.log fk.log fp.log fu.log fz.log
1.txt fb.log fg.log fl.log fq.log fv.log rh
2.txt fc.log fh.log fm.log fr.log fw.log test.txt
abc.txt fd.log fi.log fn.log fs.log fx.log
[root@localhost data]# ls f[zhou].log //包含z、h、o、u四个字母中的任意一个就会显示(只匹配单个字符)
fh.log fo.log fu.log fz.log
[root@localhost data]# ls f[x-z].log //显示xXyYz,不包括Z
fx.log fX.log fy.log fY.log fz.log
[root@localhost data]# ls f[a-c].log //显示aAbBc,不包括C
fa.log fA.log fb.log fB.log fc.log
[root@localhost data]# ls f{a..c}.log //显示abc所有小写
fa.log fb.log fc.log
[root@localhost data]# ls 1[[:lower:]]* //显示小写字母
1a1.txt 1e1.txt 1i1.txt 1m1.txt 1q1.txt 1u1.txt 1y1.txt
1b1.txt 1f1.txt 1j1.txt 1n1.txt 1r1.txt 1v1.txt 1z1.txt
[root@localhost data]# ls 1[[:upper:]]* //显示大写字母
[root@localhost data]# ls 1[[:upper:]]*
1A1.txt 1E1.txt 1I1.txt 1M1.txt 1Q1.txt 1U1.txt 1Y1.txt
3)使用{1..10}和[0-9],数字的匹配。
[root@localhost data]# touch f{1..9}.txt
[root@localhost data]# touch f{10..20}.txt
[root@localhost data]# ls f[0-9].txt //[0-9]只能匹配10以下的数字
f1.txt f2.txt f3.txt f4.txt f5.txt f6.txt f7.txt f8.txt f9.txt
[root@localhost data]# ls f[0-9][0-9].txt //两个[0-9]可以匹配双数字
f10.txt f11.txt f12.txt f13.txt f14.txt f15.txt f16.txt f17.txt f18.txt f19.txt f20.txt
[root@localhost data]# ls f{10..20}.txt //{10..20}可以匹配双数字
f10.txt f11.txt f12.txt f13.txt f14.txt f15.txt f16.txt f17.txt f18.txt f19.txt f20.txt
[root@localhost data]# ls f??.txt //两个?号可以匹配两个字符
f10.txt f11.txt f12.txt f13.txt f14.txt f15.txt f16.txt f17.txt f18.txt f19.txt f20.txt
[root@localhost data]# ls f*.txt //*可以匹配任意字符
f10.txt f12.txt f14.txt f16.txt f18.txt f1.txt f2.txt f4.txt f6.txt f8.txt
f11.txt f13.txt f15.txt f17.txt f19.txt f20.txt f3.txt f5.txt f7.txt f9.txt
4)显示隐藏文件
[root@localhost data]# ls /etc/.* //显示隐藏文件也包括..的上层目录
[root@localhost data]# ls /etc/.* -d //如果不想看上层目录 就要加-d 只显示当前目录
/etc/. /etc/.. /etc/.java /etc/.pwd.lock /etc/.updated
2. alias 别名命令
- alias 空格 命令别名=“命令”
- 删除别名:unalias 别名命令
- \加别名命令 (显示原始命令)
注意:临时修改(关机或退出终端会自动消失)
[root@localhost dev]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost dev]# alias myvim='vim /etc/sysconfig/network-scripts/ifcfg-ens33'
[root@localhost dev]# alias myls=ls -alh //如果不加引号,无法识别
-bash: alias: -alh: 未找到
[root@localhost dev]# ls
[root@localhost dev]# \ls //就想使用原来的命令,在命令前加转义符\
[root@localhost dev]# unalias myvim //删除别名
[root@localhost dev]# myvim
bash: myvim: 未找到命令...
永久修改(需要修改配置文件) :
- 在/etc/.bashrc 会影响全部
- /root/.bashrc只影响当前用户
注意:
- 命令执行顺序:别名命令>内部命令>hash命令>外部命令。
- 实际项目中需先查看其他人有没有定义别名命令。
3. du (disk usage) 统计目录或文件所占磁盘空间大小的命令
命令格式:du 空格 [选项] 空格 [文件或目录… ]
| 选项 | 说明 |
|---|---|
| -a | 统计磁盘空间占用时包括所有的文件,而不仅仅只统计目录(包括隐藏文件) |
| -h | 以更人性化的方式(默认以KB计数,但不显示单位)显示出统计结果 |
| -s | 只统计所占用空间总的(Summary)大小,而不是统计每个子目录、文件的大小 |
| --max-depth=n | 最大显示到第n层 (-d n) |
| --exclude | 排除某些文件后,显示剩余大小 |
| -x | 仅当前文件夹 |
| 示例: |
[root@localhost ~]# du --max-depth=1 //统计当前目录大小,只显示到第二级目录
3800 ./.cache
4 ./.dbus
108 ./.config
0 ./桌面
0 ./下载
0 ./模板
0 ./公共
0 ./文档
0 ./音乐
0 ./图片
0 ./视频
312 ./.local
4272 .
注意:
- -a -s无法同时使用。
- du显示的是文件占磁盘大小,不是文件的实际大小。
- 每个磁盘分块,每块(4K)只能存一个文件,当文件不足4K时,du统计也会按4K计算。
4. mkdir (make direction)创建目录或文件夹
命令格式:mkdir 空格 [选项] 空格 目录位置及名称…
- -p 递归创建多层目录,当上级目录不存在时,会按目录层级自动创建目录。
- -v 显示建立过程。
[root@localhost data]# mkdir a b c d //创建多个目录
[root@localhost data]# ls
a b c d
[root@localhost data]# mkdir -p aaa/bbb/cccc //递归创建目录
[root@localhost data]# ls
a aaa b c d
[root@localhost data]# tree //以树状图形式列出目录的内容,显示出文件目录结构
.
├── a
├── aaa
│ └── bbb
│ └── cccc
├── b
├── c
└── d
[root@localhost data]# mkdir `date` //创建含有当天日期、时间的目录
[root@localhost data]# ls
03月 14:00:53 28日 2024年 CST 星期四
5. touch 创建文件
touch命令格式:touch 空格 文件名称(可为空)
- touch 文件若已存在,不会破坏已有文件,会更新时间
每个文件有三个时间戳:
- access time 访问时间,atime,读取文件内容
- modify time 修改时间,mtime,改变文件内容(数据)
- change time 改变时间,ctime,元数据发生改变(文件大小、权限等属性)
[root@localhost data]# touch 1 2 3 //创建新文件,或空的新文件
[root@localhost data]# ls
1 2 3
[root@localhost data]# echo "" > 4 //创建4的空文件
[root@localhost data]# ls
1 2 3 4
[root@localhost bin]# stat /etc/passwd //查看三种时间
文件:"/etc/passwd"
大小:2337 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:9381005 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:passwd_file_t:s0
最近访问:2021-08-28 22:53:51.539000016 +0800
最近更改:2021-08-27 16:48:55.881739056 +0800
最近改动:2021-08-27 16:48:55.881739056 +0800
[root@localhost bin]# touch /etc/passwd //刷新三种时间
[root@localhost bin]# stat /etc/passwd
文件:"/etc/passwd"
大小:2337 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:9381005 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:passwd_file_t:s0
最近访问:2024-03-28 14:10:24.305128380 +0800
最近更改:2024-03-28 14:10:24.305128380 +0800
最近改动:2024-03-28 14:10:24.305128380 +0800
创建时间:-
[root@localhost data]# touch `date` //创建含有当天日期、时间的文件
[root@localhost data]# ls
03月 14:10:24 28日 2024年 CST 星期四
6. ln 创建链接文件
6.1 硬链接
硬链接(hard link, 也称链接 )就是一个文件的一个或多个文件名, 把文件名和计算机文件系统使用的节点号链接起来。可以将它理解为一个 “指向原始文件 inode 的指针”, 系统不为它分配独立的 inode 和 文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。
硬链接引用的是文件在文件系统中的物理索引(也称为inode)。当移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置,这样有助于文件的安全。如果删除的文件有相应的硬链接,那么这个文件依然会保留,直到所有对它的引用都被删除。
注意事项:
- 硬链接只能对已存在的文件进行创建 。
- 不支持给目录创建硬链接;
- 不支持跨分区创建硬链接。
- 硬链接文件不占用存储空间。
- 修改源文件或者目标文件,对应另外一个文件也会发生相应修改。
- 删除源文件或者目标文件,对另外一个文件没有影响。
6.2 软链接
软链接又叫符号链接,这个文件包含了另一个文件的路径名。 可以是任意文件或目录,可以链接不同文件系统的文件。
注意事项:
- 可对不存在的文件或目录创建软链接,可交叉文件系统。
- 删除源文件无法访问,再新建同名文件后依然可以访问。
硬链接和软链接对比:
| 对比项 | 硬链接 | 软链接 |
|---|---|---|
| 本质 | 本质是同一个文件 | 本质不是同一个文件 |
| inode | 和源文件相同 | 和源文件不同 |
| 链接数 | 创建新的硬链接,链接数会增加;删除硬链接,链接数减少 | 删除新建不会改变 |
| 目录 | 不支持 | 支持 |
| 删除源文件 | 只是链接数减一,但链接文件的访问不受影响 | 无法访问链接文件 |
| 文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
| 文件大小 | 和源文件相同 | 源文件的路径的长度 |
6.3 如何创建硬链接和软链接
ln命令格式:
- 创建硬链接文件:ln 空格 源文件 空格 目标文件
- 创建软连接文件:ln 空格 -s 空格 源文件 空格 目标文件
硬链接示例:
[root@localhost data]# ln /data/f1.txt /data/f11.txt //给文件创建硬链接
[root@localhost data]# ls
f1.txt f11.txt
[root@localhost data]# ln /data/f1.txt /boot/f111.txt //不能跨分区创建硬链接
ln: 无法创建硬链接"/boot/f111.txt" => "/data/f1.txt": 无效的跨设备连接
[root@localhost tmp]# ln /tmp/ceshi ceshi01 //不支持给目录创建硬链接
ln: "/tmp/ceshi": 不允许将硬链接指向目录
软链接示例:
[root@localhost test]# ln -s file1.txt soft.txt //给文件创建软链接
[root@localhost test]# ls
file1.txt soft.txt
[root@localhost test]# ln -s /tmp/dir01 dir02 //给目录创建软链接
[root@localhost test]# ls
file1.txt soft.txt dir02
[root@localhost lianjie2]# find file99.txt
find: ‘file99.txt’: 没有那个文件或目录
[root@localhost lianjie2]# ln -s file99.txt soft99.txt //可对不存在的文件或目录创建软链接
[root@localhost lianjie2]# ls
file1 file2 hard.txt soft1 soft99.txt soft.txt
7. cp (copy)复制文件
cp命令格式:
- cp [选项]… 源文件 目标 相当改名复制
- cp [选项]... 源文件... 目录 多个源文件只能复制到文件夹
选项说明:
| 选项 | 说明 |
|---|---|
| -f | 覆盖目标同名文件或目录时不进行提醒,直接强制复制 |
| -i | 覆盖目标同名文件或目录时提醒用户确认 |
| -p | 复制时保持源文件的权限、属主及时间标记等属性不变(但不保留软链接文件) |
| -r | 复制目录时必须使用此选项,表示递归复制所有文件及子目录 |
| -a | 完整保留所有的信息(保留软链接属性) |
| -v | 可视化 |
| -u | 相当于增备,差异备份(只针对文件夹) |
| -b | 当目标文件存在时,先进行备份再覆盖(只保留最近) |
| -s | 复制成为符号连结文件 (symbolic link),亦即”快捷方式“档案; 作用为创建新的符号链接文件,指向原符号链接文件,能保证链接文件可以使用 |
示例:
[zhangsan@localhost ~]$ ll
#张三用户新建文件
总用量 0
-rw-rw-r--. 1 zhangsan zhangsan 0 8月 29 11:17 zhansan
[root@localhost zhangsan]# cp -a zhansan /data/ //保留所有权限,包括软链接文件
[root@localhost data]# ll
总用量 0
-rw-r--r--. 1 root root 0 8月 29 11:06 1
-rw-rw-r--. 1 zhangsan zhangsan 0 8月 29 11:17 zhansan
[root@localhost data]# cp -r /etc/ /opt/ //复制目录需要加-r
[root@localhost data]# cp -r /etc/ /opt/etc.bak //复制并改名
[root@localhost data]# cp -r /etc/ /opt/etc.bak //复制后变成etc.bak 的子目录
[root@localhost data]# cp -r /etc/ /opt/etc.bak //目录内有相同名称子目录,系统会询问要不要覆盖,cp是别名 加\cp 直接覆盖
[root@localhost data]# cp /etc/passwd /etc/shadow /opt //复制多个文件时目标必须是目录,不能是文件,且目录要存在。
[root@localhost data]# cp /etc/passwd /etc/shadow /opt/f111.txt //复制多个文件时目标如果不是目录,系统会提示无法复制。
cp: 目标"/opt/f111.txt" 不是目录