03.文件管理和操作命令
文件管理和操作命令
- 文件管理和操作命令
- 1. 文件系统的目录结构
- 2. 文件操作命令
- 2.1 pwd
- 2.2 cd
- 2.3 ls
- 2.4 stat
- 2.5 file
- 2.6 touch
- 2.7 cp
- 2.8 mv
- 2.9 rename
- 2.10 rm
- 2.11 tree
- 2.12 mkdir
- 2.13 rmdir
- 3. 文件通配符模式
文件管理和操作命令
1. 文件系统的目录结构
- 文件和目录被组织成一个单根倒置树结构
- 文件系统从根目录下开始,用“/”表示
- 根文件系统(rootfs):root filesystem
- 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
- 以 . 开头的文件为隐藏文件
- 路径分隔的 /
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件
- 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
- 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
# 常见的文件系统目录功能
/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
/usr/bin # 保证系统拥有完整功能而提供的应用程序
/usr/sbin # 同上
/usr/lib # 32位使用
/usr/lib64 # 只存在64位系统
/usr/include # C程序的头文件(header files)
/usr/share # 结构化独立的数据,例如doc, man等
/var # variable data files,可变数据目录
/var/cache # 应用程序缓存数据目录
/var/lib # 应用程序状态信息数据
/var/local # 专用于为/usr/local下的应用程序存储可变数据
/var/lock # 锁文件
/var/log # 日志目录及文件
/var/opt # 专用于为/opt下的应用程序存储可变数据
/var/run # 运行中的进程相关数据,通常用于存储进程pid文件
/var/spool # 应用程序数据池
/var/tmp # 保存系统两次重启之间产生的临时数据
/proc # 用于输出内核与进程信息相关的虚拟文件系统
/sys # 用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux #security enhanced Linux,selinux相关的安全策略等信息的存储位置
# 文件类型标识符
- 普通文件
d 目录文件
l 符号链接文件
b 块设备文件
c 字符设备文件
p 管道文件
s 套接字文件# 文件类型颜色标识
文件类型(格式) 颜色
普通文件 白色
目录文件 蓝色
符号链接文件 浅蓝色
块设备文件 黄色
符设备文件 黄色
管道文件 青黄色
套接字文件 粉红色
图片文件 粉红色
压缩文件或文件包 红色
其他文件 灰色注意:颜色与文件类型对应关系,由配置文件定义 /etc/DIR_COLORS
管道文件
所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称 pipe 文件。
套接字文件
Socket本身有“插座”的意思,在Unix/Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为 内核借助缓冲区形成的伪文件。
2. 文件操作命令
2.1 pwd
★ 显示当前工作目录路径
[root@rocky8 ~]# pwd
/root★ 显示真实物理路径
[root@rocky8 bin]# pwd -P
/usr/bin★ 显示链接路径(默认)
[root@rocky8 bin]# pwd -L
/bin
2.2 cd
★ 更改目录
cd [-L|[-P [-e]] [-@]] [dir]-L # 切换至链接目录,默认选项
-P # 切换至真实目录,而非链接目录
cd .. # 切换至父目录
cd - # 切换到上一个目录
cd | cd ~ # 切换至当前用户家目录
cd ~username # 切换至指定用户家目录[root@rocky8 ~]# cd -L /bin
[root@rocky8 bin]# pwd
/bin[root@rocky8 bin]# cd -P /bin
[root@rocky8 bin]# pwd
/usr/bin[root@rocky8 bin]# pwd
/usr/bin
[root@rocky8 bin]# cd ..
[root@rocky8 usr]# pwd
/usr
[root@rocky8 usr]# cd -
/usr/bin[root@rocky8 bin]# cd
[root@rocky8 ~]#
[root@rocky8 ~]# pwd
/root
[root@rocky8 bin]# cd ~
[root@rocky8 ~]#
[root@rocky8 ~]# pwd
/root[root@rocky8 ~]# cd ~nan
[root@rocky8 nan]# pwd
/home/nan# 相关环境变量
$PWD # 当前目录
$OLDPWD # 上一次目录
2.3 ls
★ 列出目录内容
ls [OPTION]... [FILE]...-a|--all # 包含隐藏文件
-l # 显示额外的信息
-R|--recursive # 目录递归
-d|--directory # 仅显示当前目录
-1 # 数字1,文件分行显示
-S # 按从大到小排序
-t # 按mtime排序,时间新的靠前
-u # 配合-t选项,显示并按atime从新到旧排序
-U # 按目录存放顺序显示
-X # 按文件后缀排序
-F|--classify # 对不同类型文件显示时附加不同的符号:*/=>@|★ 注意
1. ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义
2. ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小
3. ll是ls命令的一个别名,在centos 和 ubuntu 系统中,该别名的参数不一样
2.4 stat
★ 查看文件状态 (查看文件元数据) 一个文件有两部份信息:元数据和具体内容
stat [OPTION]... FILE...-t|--terse # 使用简洁格式显示
-f|--file-system # 显示相关的文件系统信息,所谓文件系统,对应的就是windows下面的硬盘分区
-c|--format # 使用特定格式输出[root@rocky8 ~]# stat testFile: testSize: 46 Blocks: 0 IO Block: 4096 directory
Device: fd00h/64768d Inode: 135345803 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-01-23 13:41:41.377928648 +0800 # 访问时间
Modify: 2024-01-18 18:25:27.593125747 +0800 # 修改内容的时间
Change: 2024-01-18 18:25:27.593125747 +0800 # 元数据发生变化的时间Birth: 2024-01-18 14:16:13.496633276 +0800[root@rocky8 ~]# stat -t test
test 46 0 41ed 0 0 fd00 135345803 2 0 0 1705988501 1705573527 1705573527 1705558573 4096 unconfined_u:object_r:admin_home_t:s0[root@rocky8 ~]# stat -f testFile: "test"ID: fd0000000000 Namelen: 255 Type: xfs
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 18341120 Free: 16747067 Available: 16747067
Inodes: Total: 36700160 Free: 36574471[root@rocky8 ~]# stat -c "%i" test
135345803
2.5 file
★ 确定文件内容
file [options] <filename>...-b|--brief # 只显示结果,不显示文件名
-f|--files-from FILE # 从指定文件中获取要处理的文件名
-F|--separator STRING # 指定分割符
-L|--dereference # 跟随软链接[root@rocky8 test]# file fstab
fstab: ASCII text
[root@rocky8 test]# file -b fstab
ASCII text
2.6 touch
★ 创建空文件或刷新文件的时间
touch [OPTION]... FILE...-a # 改变atime,ctime
-m # 改变mtime,ctime
-h|--no-dereference # touch链接文件时,默认是操作其指向的目标文件,此选项表示操作链接文件本身
-r|--reference # 使用某个文件的更新时间和修改时间作为当前文件的更新时间和修改时间
-d|--date # 指定修改时间和访问时间,而不是采用当前系统时间
-t [[CC]YY]MMDDhhmm[.ss] # --time=WORD
--time=STRING # 指定修改项 access|atime 等同于 -a, modify|mtime 等同于 -m
-c|--no-create # 如果文件不存在,不创建[root@rocky8 day2]# touch f1.txt
[root@rocky8 day2]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 25 20:50 f1.txt[root@rocky8 ~]# ll /etc/issue
-rw-r--r--. 1 root root 23 Nov 3 11:10 /etc/issue
[root@rocky8 ~]# cat /etc/issue
\S
Kernel \r on an \m
[root@rocky8 ~]# touch /etc/issue
[root@rocky8 ~]# ll /etc/issue
-rw-r--r--. 1 root root 23 Jan 25 20:53 /etc/issue
[root@rocky8 ~]# cat /etc/issue
\S
Kernel \r on an \m[root@rocky8 day2]# stat f1.txt File: f1.txtSize: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 135345799 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-01-25 20:50:36.505157781 +0800
Modify: 2024-01-25 20:50:36.505157781 +0800
Change: 2024-01-25 20:50:36.505157781 +0800Birth: 2024-01-25 20:50:36.505157781 +0800
[root@rocky8 day2]# touch -d "2024-01-05 02:02:02" f1.txt
[root@rocky8 day2]# stat f1.txt File: f1.txtSize: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 135345799 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-01-05 02:02:02.000000000 +0800
Modify: 2024-01-05 02:02:02.000000000 +0800
Change: 2024-01-25 21:00:35.711139037 +0800Birth: 2024-01-25 20:50:36.505157781 +0800[root@rocky8 day2]# stat f2.txt File: f2.txtSize: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 135345838 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-01-25 21:02:52.598134755 +0800
Modify: 2024-01-25 21:02:52.598134755 +0800
Change: 2024-01-25 21:02:52.598134755 +0800Birth: 2024-01-25 21:02:52.598134755 +0800
[root@rocky8 day2]# stat f3.txt File: f3.txtSize: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 135345849 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-01-25 21:03:45.601133097 +0800
Modify: 2024-01-25 21:03:45.601133097 +0800
Change: 2024-01-25 21:03:45.601133097 +0800Birth: 2024-01-25 21:03:45.601133097 +0800
[root@rocky8 day2]# touch -r f2.txt f3.txt
[root@rocky8 day2]# stat f3.txt File: f3.txtSize: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 135345849 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-01-25 21:02:52.598134755 +0800
Modify: 2024-01-25 21:02:52.598134755 +0800
Change: 2024-01-25 21:05:12.309130385 +0800Birth: 2024-01-25 21:03:45.601133097 +0800[root@rocky8 day2]# touch -t 01010101 f4
[root@rocky8 day2]# stat f4File: f4Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 135345851 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-01-01 01:01:00.000000000 +0800
Modify: 2024-01-01 01:01:00.000000000 +0800
Change: 2024-01-25 21:14:05.665113702 +0800Birth: 2024-01-25 21:13:02.956115663 +0800
2.7 cp
★ 复制文件和目录
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...-i|--interactive # 如果目标文件己存在,则提示是否覆盖
-n|--no-clobber # 如果目标文件己存在,则跳过此文件复制
-R|-r|--recursive # 递归复制,可用于目录的复制
-a|--archive # 保留所有属性 相当于 dpR 选项组合
-s|--symbolic-link # 不复制文件,而是创建链接
-p # 同时复制访问时间,修改时间,权限等属性,同 --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] # 选择属性,默认为 mode,ownership,timestamps
-u|--update # 当源文件比目标文件新时,才执行复制操作
-v|--verbose # 显示复制过程
-b # 先备份再覆盖
--backup=numbered # 目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本# 注意:
1. 复制文件
目标不存在:创建新文件,内容与源文件相同。
目标是文件:默认覆盖目标文件,可加 -i 防止误覆盖。
目标是目录:将文件复制到该目录中,文件名保持不变。
2. 复制目录(需 -r 或 -R 递归复制)
目标不存在:创建同名目录,并复制所有内容进去。
目标是目录:将源目录(含内容)复制到该目录下,生成同名子目录。
目标是文件:报错,不允许复制。[root@rocky8 day2]# cp fa fa.bak
[root@rocky8 day2]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 25 21:17 fa
-rw-r--r--. 1 root root 0 Jan 25 21:29 fa.bak[root@rocky8 day2]# cat fa
11111
[root@rocky8 day2]# cat fa.bak
22222
[root@rocky8 day2]# cp -i fa fa.bak
cp: overwrite 'fa.bak'? y
[root@rocky8 day2]# cat fa.bak
11111[root@rocky8 day2]# cat fb
33333
[root@rocky8 day2]# cat fb.bak
44444
[root@rocky8 day2]# cp -n fb fb.bak
[root@rocky8 day2]# cat fb.bak
44444[root@rocky8 day2]# cp -r /etc/sysconfig/ data
[root@rocky8 day2]# tree data[root@rocky8 day2]# ll
-rw-r--r--. 1 root root 0 Jan 25 21:17 fc
-rw-r--r--. 1 root root 0 Jan 26 09:29 fc.bak
[root@rocky8 day2]# cp -p fc fc.bak
cp: overwrite 'fc.bak'? y
[root@rocky8 day2]# ll
-rw-r--r--. 1 root root 0 Jan 25 21:17 fc
-rw-r--r--. 1 root root 0 Jan 25 21:17 fc.bak[root@rocky8 day2]# cat fd
ddddddddd
[root@rocky8 day2]# cat fe
eeeeeeee
[root@rocky8 day2]# cp -b fd fe
cp: overwrite 'fe'? y
[root@rocky8 day2]# ll
-rw-r--r--. 1 root root 10 Jan 26 09:37 fd
-rw-r--r--. 1 root root 10 Jan 26 09:37 fe
-rw-r--r--. 1 root root 9 Jan 26 09:37 fe~
[root@rocky8 day2]# cat fe
ddddddddd
[root@rocky8 day2]# cat fe~
eeeeeeee
2.8 mv
★ 移动和重命名文件
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...-b # 如果目标存在,则先备份
-n|--no-clobber # 如果目标文件己存在,则跳过此文件移动
-i|--interactive # 如果目标文件己存在,则提示是否覆盖
-u|--update # 当源文件比目标文件新时,才执行移动操作
-v|--verbose # 显示移动过程[root@rocky8 day2]# mv -b fa fb
mv: overwrite 'fb'? y
[root@rocky8 day2]# ll
-rw-r--r--. 1 root root 6 Jan 25 21:33 fb
-rw-r--r--. 1 root root 6 Jan 25 21:36 fb~★ 移动多个文件到目录
[root@rocky8 day2]# mv fb fc fd fe file/
[root@rocky8 day2]# ls file
fb fc fd fe★ 将 file目录放入file1目录中,如果file1目录不存在,则将file目录改名为file1目录
[root@rocky8 day2]# mv file file1
[root@rocky8 day2]# ls file
ls: cannot access 'file': No such file or directory
[root@rocky8 day2]# ls file1
fb fc fd fe★ 注意:mv 命令可以实现文件或目录的移动和改名同一分区移动数据,速度很快:数据位置没有变化不同分区移动数据,速度相对慢:数据位置发生了变化
2.9 rename
★ 批量修改文件名
rename [options] <expression> <replacement> <file>...-v|--verbose # 显示过程
-s|--symlink # 如果目标是链接文件,则是重命名其指向
-n|--no-act # 不做任何改变
-o|--no-overwrite # 不覆盖己存在文件★ 为所有的f开头包含txt的文件加上.bak后缀
[root@rocky8 day2]# rename '.txt' '.txt.bak' f*
[root@rocky8 day2]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 26 10:04 f1.txt.bak
-rw-r--r--. 1 root root 0 Jan 26 10:04 f2.txt.bak
-rw-r--r--. 1 root root 0 Jan 26 10:04 f3.txt.bak
-rw-r--r--. 1 root root 0 Jan 26 10:04 f4.txt.bak
-rw-r--r--. 1 root root 0 Jan 26 10:04 f5.txt.bak★ 去掉所有的bak后缀
[root@rocky8 day2]# rename '.bak' '' *.bak
[root@rocky8 day2]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 26 10:04 f1.txt
-rw-r--r--. 1 root root 0 Jan 26 10:04 f2.txt
-rw-r--r--. 1 root root 0 Jan 26 10:04 f3.txt
-rw-r--r--. 1 root root 0 Jan 26 10:04 f4.txt
-rw-r--r--. 1 root root 0 Jan 26 10:04 f5.txt★ 将当前目录下以.txt结尾的文件,批量改名成 .log结尾
[root@rocky8 day2]# rename -v txt log *.txt
`f1.txt' -> `f1.log'
`f2.txt' -> `f2.log'
`f3.txt' -> `f3.log'
`f4.txt' -> `f4.log'
`f5.txt' -> `f5.log'
[root@rocky8 day2]# ls
f1.log f2.log f3.log f4.log f5.log★ 将fa.link 指向的文件由 fa 改成 fb
[root@rocky8 day2]# ll
lrwxrwxrwx. 1 root root 2 Jan 26 10:16 fa.link -> fa
[root@rocky8 day2]# rename -s fa fb fa.link
[root@rocky8 day2]# ll
lrwxrwxrwx. 1 root root 2 Jan 26 10:17 fa.link -> fb
2.10 rm
★ 删除文件和目录
注意:此命令非常危险,慎重使用,建议使用 mv 代替 rmrm [OPTION]... [FILE]...-i # 删除前确认
-f|--force # 不确认直接删除
-r|-R|--recursive # 递归删除
-d|--dir # 删除空目录
--no-preserve-root # 强删根目录★ 删除根下所有内容
[root@rocky86 ~]# rm -rf /*★ 删除所有以a开头的文件
[root@rocky86 ~]# rm -f a*★ 删除当前目录下所有内容
[root@rocky86 ~]# rm -f *[root@rocky86 ~]# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
2.11 tree
★ 显示目录树
tree [-acdfghilnpqrstuvxACDFJQNSUX] [-H baseHREF] [-T title ]-a # 显示所有,包括隐藏目录和文件
-d # 只显示目录
-f # 显示所有内容的完整路径
-F # 在执行文件,目录,Socket,符号链接,管道文件,各自加上"*","/","=","@","|"号
-g # 显示文件属组,没找到组名,以gid代替
-u # 显示文件属主,没找到用户名,以uid代替
-p # 显示内容权限
-s # 显示内容大小
-i # 不以层级结构显示
-n # 不显示颜色
-t # 显示时用修改时间排序
-r # 以默认显示顺序的反向规则显示,默认以数字,首字母的顺序规则来显示
-o filename # 将显示的内容输出到指定文件中
-L n # 只显示n层目录
-D # 显示内容修改时间
-C # 显示色彩[root@rocky8 ~]# tree
.
├── anaconda-ks.cfg
├── initial-setup-ks.cfg
└── test├── day1└── day23 directories, 2 files★ 仅显示两层目录
[root@rocky8 ~]# tree test -d -L 2 /root
test
├── day1
└── day2
2 [error opening dir]
/root
└── test├── day1└── day25 directories
2.12 mkdir
★ 创建目录
mkdir [OPTION]... DIRECTORY...-m|--mode # 目录权限属性
-p|--parents # 如果要创建的目录父级目录不存在,则一起创建,是递归的意思
-v|--verbose # 显示创建过程[root@rocky8 day2]# mkdir a
[root@rocky8 day2]# ls
a[root@rocky8 day2]# mkdir -pv aa/bb/cc
mkdir: created directory 'aa'
mkdir: created directory 'aa/bb'
mkdir: created directory 'aa/bb/cc'
[root@rocky8 day2]# tree
.
├── a
└── aa└── bb└── cc4 directories, 0 files
2.13 rmdir
★ 删除空目录
rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树rmdir [OPTION]... DIRECTORY...--ignore-fail-on-non-empty # 忽略非空错误提示
-p|--parents # 连着父目录一起删除
-v|--verbose # 显示删除过程[root@rocky86 ~]# rmdir -pv a/b/c/d
rmdir: removing directory, 'a/b/c/d'
rmdir: removing directory, 'a/b/c'
rmdir: removing directory, 'a/b'
rmdir: removing directory, 'a'
3. 文件通配符模式
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符
* # 匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? # 匹配任何单个字符,一个汉字也算一个字符
~ # 当前用户家目录
. # 当前工作目录
~+ # 当前工作目录
~- # 前一个工作目录
~nan # 用户nan家目录
[0-9] # 匹配数字范围
[a-z] # 一个字母
[A-Z] # 一个字母
[wang] # 匹配列表中的任何的一个字符
[^wang] # 匹配列表中的所有字符以外的字符
[^a-z] # 匹配列表中的所有字符以外的字符[:digit:] # 任意数字,相当于0-9
[:lower:] # 任意小写字母,表示 a-z
[:upper:] # 任意大写字母,表示 A-Z
[:alpha:] # 任意大小写字母
[:alnum:] # 任意数字或字母
[:blank:] # 水平空白字符
[:space:] # 水平或垂直空白字符
[:punct:] # 标点符号
[:print:] # 可打印字符
[:cntrl:] # 控制(非打印)字符
[:graph:] # 图形字符
[:xdigit:] # 十六进制字符