linux学习文件管理3.1

Linux下的文件类型

七种文件类型

  • -普通文件
  • d 目录文件directory
  • l 符号链接文件link
  • b 块设备block
  • c 字符设备character
  • p 管道文件pipe
  • s 套接字文件socket

文件操作命令

显示当前工作目录

pwd命令: printing working directory

  • -P 显示真实物理路径 *-L 显示链接路径(默认) 范例:
[root@centos8 ~]#pwd
/root

绝对和相对路径

  • 绝对路径 以正斜杠/ 即根目录开始 完整的文件的位置路径 可用于任何想指定一个文件名的时候
  • 相对路径名 不以斜线开始 一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置 可以作为一个简短的形式指定一个文件
    ../ 从上一级开始
    ./ 当前路径

工具

基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
范例:

[root@centos8 bin]#basename /etc/sysconfig/network
network
[root@centos8 bin]#dirname /etc/sysconfig/network
/etc/sysconfig
[root@centos8 ~]#dirname /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts
[root@centos8 ~]#basename /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0

范例:

[root@ubuntu2004 ~]#basename http://nginx.org/download/nginx-1.18.0.tar.gz
nginx-1.18.0.tar.gz
[root@ubuntu2004 ~]#basename http://nginx.org/download/nginx-1.18.0.tar.gz
.tar.gz
nginx-1.18.0
[root@ubuntu2004 ~]#basename -s .tar.gz http://nginx.org/download/nginx-
1.18.0.tar.gz
nginx-1.18.0
[root@ubuntu2004 ~]#url=http://nginx.org/download/nginx-1.18.0.tar.gz
[root@ubuntu2004 ~]#echo $url
http://nginx.org/download/nginx-1.18.0.tar.gz
[root@ubuntu2004 ~]#basename $url
nginx-1.18.0.tar.gz

更改目录

命令 cd : change directory 改变目录
选项:-P 切换至物理路径,而非软链接目录
可以使用绝对或相对路径

  • 切换至父目录: cd ..
  • 切换至当前用户主目录: cd
  • 切换至以前的工作目录: cd -

范例:

[root@centos8 ~]#cd /etc/sysconfig
[root@centos8 sysconfig]#pwd
/etc/sysconfig
[root@centos8 sysconfig]#cd ../../data
[root@centos8 data]#pwd
/data
[root@centos8 data]#cd /bin
[root@centos8 bin]#pwd
/bin
[root@centos8 bin]#cd -P /bin
[root@centos8 bin]#pwd
/usr/bin

ls -a 显示隐藏
ls -Sa -l 显示隐藏并大小排序
ls -Sa -lr 同上,从小到大排序

列出目录内容

ls 命令可以列出当前目录的内容或指定目录
用法: ls [options] [files_or_dirs]

常见选项:

  • -a 包含隐藏文件
  • -l 显示额外的信息
  • -R 目录递归
  • -ld 目录和符号链接信息
  • -1 文件分行显示
  • -S 按从大到小排序
  • -t 按mtime排序
  • -u 配合-t选项,显示并按atime从新到旧排序
  • -U 按目录存放顺序显示
  • -X 按文件后缀排序
  • -F 对不同类型文件显示时附加不同的符号:*/=>@|
  • -C 文件多时,以多列的方式显示文件,默认是一列(标准输出)

查看文件状态 stat

文件相关信息:metadata, data
每个文件有三个时间戳:

  • access time 访问时间,atime,读取文件内容
  • modify time 修改时间,mtime,改变文件内容(数据)
  • change time 改变时间,ctime,元数据发生改变
[root@centos8 ~]#stat /etc/passwd
File: /etc/passwd
Size: 1306 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 134792556 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-12-09 20:37:12.830991350 +0800
Modify: 2019-12-09 20:37:12.826991351 +0800
Change: 2019-12-09 20:37:12.826991351 +0800
Birth: -

确定文件内容

文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使 用
格式: file [options ] < filename>…

常用选项:

  • -b 列出文件辨识结果时,不显示文件名称
  • -f filelist 列出文件filelist中文件名的文件类型
  • -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
  • -L 查看对应软链接对应文件的文件类型
  • –help 显示命令在线帮助

范例:windows的文本格式和Linux的文本格式的区别

[root@centos8 data]#cat linux.txt
a
b
c
[root@centos8 data]#cat win.txt
a
b
c[root@centos8 data]#file win.txt linux.txt
win.txt: ASCII text, with CRLF line terminators
linux.txt: ASCII text

[root@centos8 data]#hexdump -C linux.txt
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
[root@centos8 data]#hexdump -C win.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007

#安装转换工具
[root@centos8 data]#dnf -y install dos2unix
#将Windows的文本格式转换成的Linux文本格式

[root@centos8 data]#dos2unix win.txt
dos2unix: converting file win.txt to Unix format...
[root@centos8 data]#file win.txt
win.txt: ASCII text

#将Linux的文本格式转换成Windows的文本格式
[root@centos8 data]#unix2dos win.txt
unix2dos: converting file win.txt to DOS format...
[root@centos8 data]#file win.txt
win.txt: ASCII text, with CRLF line terminators

范例:转换文件字符集编码

#显示支持字符集编码列表
[root@centos8 ~]#iconv -l
#windows7上文本默认的编码ANSI(GB2312)
[root@centos8 data]#file windows.txt
windows.txt: ISO-8859 text, with no line terminators
[root@centos8 data]#echo $LANG
en_US.UTF-8
#默认在linux无法正常显示文本内容
[root@centos8 data]#cat windows.txt
▒▒▒▒▒▒[root@centos8 data]#
#将windows7上文本默认的编码ANSI(GB2312)转换成UTF-8
[root@centos8 data]#iconv -f gb2312 windows.txt -o windows1.txt
[root@centos8 data]#cat windows1.txt
马哥教育[root@centos8 data]#ll windows1.txt
-rw-r--r-- 1 root root 12 Mar 23 10:13 windows1.txt
[root@centos8 data]#file windows1.txt
windows1.txt: UTF-8 Unicode text, with no line terminators
#将UTF-8转换成windows10上文本默认的编码ANSI(GB2312)
[root@centos8 data]#iconv -f utf8 -t gb2312 windows1.txt -o windows2.txt
[root@centos8 data]#file windows2.txt
windows2.txt: ISO-8859 text, with no line terminators

范例:

[15:34:50 root@centos8 ~]#file linux.txt
linux.txt: ASCII text
[15:34:31 root@centos8 ~]#file windows.txt
windows.txt: ASCII text, with CRLF line terminators
#将windows的文本格式转换成Linux的文本格式
[15:35:26 root@centos8 ~]#dos2unix windows.txt
dos2unix: converting file windows.txt to Unix format...
[15:36:00 root@centos8 ~]#file windows.txt
windows.txt: ASCII tex

文件通配符模式 wildcard pattern

文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件 通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符 常见的通配符如下:

* 匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? 匹配任何单个字符,一个汉字也算一个字符
~ 当前用户家目录
~mage 用户mage家目录
[0-9] 匹配数字范围
[a-z] 一个字母
[A-Z] 一个字母
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
[^a-z] 匹配列表中的所有字符以外的字符
. 和 ~+ 当前工作目录
~- 前一个工作目录

另外还有在Linux系统中预定义的字符类表示法如下:man 7 glo

[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符

范例:

[root@centos8 wang]#echo $OLDPWD
/data
[root@centos8 wang]#ll -/linux.txt
ls: invalid option -- '/'
Try 'ls --help' for more information.
[root@centos8 wang]#ll ~-/linux.txt
-rw-r--r-- 1 root root 6 Mar 23 09:48 /data/linux.txt

创建空文件和刷新时间

touch命令可以用来创建空文件或刷新文件的时间
格式:

touch [OPTION]... FILE
  • -a 仅改变 atime和ctime
  • -m 仅改变 mtime和ctime
  • -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
  • -c 如果文件不存在,则不予创建

范例:

[root@ubuntu2004 snap]#stat 123.txt
  File: 123.txt
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 2490387     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-09 10:10:55.000000000 +0800
Modify: 2020-08-09 10:10:55.000000000 +0800
Change: 2024-10-22 22:35:29.388924351 +0800
 Birth: -
[root@ubuntu2004 snap]#touch -a 123.txt
[root@ubuntu2004 snap]#stat 123.txt
  File: 123.txt
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 2490387     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2024-10-22 22:36:11.765514662 +0800
Modify: 2020-08-09 10:10:55.000000000 +0800
Change: 2024-10-22 22:36:11.765514662 +0800
 Birth: -
[root@ubuntu2004 snap]#touch -m 123.txt
[root@ubuntu2004 snap]#stat 123.txt
  File: 123.txt
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 2490387     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2024-10-22 22:36:11.765514662 +0800
Modify: 2024-10-22 22:37:07.050290872 +0800
Change: 2024-10-22 22:37:07.050290872 +0800
 Birth: -
[root@ubuntu2004 snap]#touch -t 202109010800.00 --time=atime --time=mtime 123.txt
[root@ubuntu2004 snap]#stat 123.txt
  File: 123.txt
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 2490387     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-09-01 08:00:00.000000000 +0800
Modify: 2021-09-01 08:00:00.000000000 +0800
Change: 2024-10-22 22:38:59.847893212 +0800
 Birth: -
[root@centos8 data]#date
Fri Dec 13 16:11:55 CST 2019
[root@centos8 data]#touch `date -d "-1 day" +%F_%T`.log
[root@centos8 data]#ls
2019-12-12_16:11:48.log
[root@centos8 data]#touch $(date -d "1 year" +%F_%T).log
[root@centos8 data]#ls
2019-12-12_16:11:48.log 2020-12-13_16:13:11.log

复制文件和目录

利用 cp(copy)命令可以实现文件或目录的复制
格式:

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE..

常用选项

  • -i 如果目标已存在,覆盖前提示是否覆盖
  • -n 不覆盖,注意两者顺序
  • -r, -R 递归复制目录及内部的所有内容
  • -a 归档,相当于-dR –preserv=all,常用于备份功能
  • -d –no-dereference –preserv=links 不复制原文件,只复制链接名
  • –preserv[=ATTR_LIST
mode: 权限
ownership: 属主属组
timestamp:
links
xattr
context
all
  • -p 等同–preserv=mode,ownership,timestamp
  • -v –verbose
  • -f –force
  • -u –update 只复制源比目标更新文件或目标不存在的文件
  • -b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份
  • –backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本.

练习
1、每天将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为 backupYYYY- mm-dd,备份过程可见

[root@centos8 ~]#cp -av /etc/ /data/backup`date +%F`
[root@centos8 ~]#cp -av /etc/ /data/etc-`date +%F_%H-%M-%S

2、创建/data/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权

[root@centos8 ~]#cp -a /root /data/rootdir

移动和重命名文件

  • mv 命令可以实现文件或目录的移动和改名
  • 同一分区移动数据,速度很快:数据位置没有变化
  • 不同分区移动数据,速度相对慢:数据位置发生了变化 格式
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

常用选项:

  • -i 交互式
  • -f 强制
  • -b 目标存在,覆盖前先备份 利用 rename 可以批量修改文件名

格式:

rename [options] <expression> <replacement> <file>...

范例:

#为所有的f开头包含conf的文件加上.bak后缀:
rename 'conf' 'conf.bak' f*
#去掉所有的bak后缀:
rename '.bak' '' *.bak
# 所有.txt后缀更改为txt.orig
rename txt txt.orig *.txt
#还原
rename txt.orig.txt *.txt.orig

删除文件

使用 rm 命令可以删除文件和目录
注意:此命令非常危险,慎重使用,建议使用 mv 代替 rm
格式:

rm [OPTION]... FILE..

常用选项:

  • -i 交互式
  • -f 强制删除
  • -r 递归
  • –no-preserve-root 删除
    范例:
root@centos8 ~]#rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
#思考删除/ 文件,如何验证
[root@centos8 ~]#rm -rf /*
[root@centos8 ~]#/2TAB
[root@centos8 ~]#echo *

范例: rm 别名

[root@centos8 ~]#alias rm="echo 请使用mv"

范例:删除特殊文件

#将名为 “/data/-f” 的文件删除
[root@centos8 data]#rm -f -f #此方式错误
[root@centos8 data]#rm -- -f
[root@centos8 data]#rm ./-f
[root@centos8 data]#rm /data/-f
[root@centos8 data]#touch '~'
[root@centos8 data]#ls
'~'
[root@centos8 data]#rm -f ~
rm: cannot remove '/root': Is a directory
[root@centos8 data]#rm -- ~
rm: cannot remove '/root': Is a directory
[root@centos8 data]#rm -f ./~

rm 虽然删除了文件,但是被删除的文件仍然可能被恢复,在安全要求较高的场景下,可以使用shred安 全删除文件

目录操作

显示目录树 tree

常见选项:

  • -d: 只显示目录
  • -L level:指定显示的层级数目
  • -P pattern: 只显示由指定wild-card pattern匹配到的路径

创建目录 mkdir

常见选项:

  • -p: 存在于不报错,且可自动创建所需的各目录
  • -v: 显示详细信息
  • -m MODE: 创建目录时直接指定权限

删除空目录 rmdir

常见选项:

  • -p 递归删除父空目录
  • -v 显示详细信息

注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树 范例:

alias rm='DIR=/data/backup`date +%F%T`;mkdir $DIR;mv -t $DIR

练习

(1) 如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b

(2) 如何创建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a, /testdir/dir2/x/b

(3) 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7

文件元数据和节点表结构

inode 表结构

每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数 据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个 文件的元数据信息
每一个inode表记录对应的保存了以下信息:

  • inode number 节点号
  • 文件类型
  • 权限
  • UID
  • GID
  • 链接数(指向这个文件名路径名称个数)
  • 该文件的大小和不同的时间戳
  • 指向磁盘上文件的数据块指针
  • 有关文件的其他数据

(1)前12个直接指针,直接指向存储的数据区域kBlocks大小为4096,则前12个直接指针就可以保存48KB文件。
(2)一级指针可存储文件大小计算假设每个指针占用4个字节,则一经指针指向的Block可保存40964个指针。可指两1024个Block5。一级指针可存储文件数据大小为10244096 4MB.
(3)二级指针可存储文件大小计算同样按照Blocks大小为4096,则二级指针可保存的Block指针数量为(4096/4)
(409614)=10241024;则二级指行可保存的文件数量大小为(10241024)“4096=4GB.
(4)三级指针可存储文件大小计算以一级、二级指针计算方法类推,三根指针可存储的文伴数据大小为(102410241024)*4096 =4TB.

目录

目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系

  • 文件引用一个是 inode号
  • 人是通过文件名来引用一个文件
  • 一个目录是目录下的文件名和文件inode号之间的映射

cp和inode

cp 命令:

  • 分配一个空闲的inode号,在inode表中生成新条目
  • 在目录中创建一个目录项,将名称与inode编号关联
  • 拷贝数据生成新的文件

rm和inode

rm 命令:

  • 链接数递减,从而释放的inode号可以被重用
  • 把数据块放在空闲列表中
  • 删除目录项
  • 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖

mv和inode

  • 如果mv命令的目标和源在相同的文件系统,作为mv 命令

用新的文件名创建对应新的目录项

删除旧目录条目对应的旧的文件名

  • 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动! 如果目标和源在一个不同的文件系统, mv相当于cp和rm

范例:

[root@centos8 ~]#df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 65536 310 65226 1% /boot
[root@centos8 ~]#mkdir /boot/test
[root@centos8 ~]#touch /boot/test/file{1..65226}
[root@centos8 ~]#touch /boot/test/new.txt
touch: cannot touch 'new.txt': No space left on device
[root@centos8 ~]#df /boot
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 999320 133800 796708 15% /boot
[root@centos8 ~]#df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 65536 65536 0 100% /boo

范例:删除大文件

[root@centos8 ~]#cat /dev/null > /var/log/huge.log

硬(hard)链接

硬链接本质上就给一个文件起一个新的名称,实质是同一个文件 硬链接特性

  • 创建硬链接会在对应的目录中增加额外的记录项以引用文件
  • 对应于同一文件系统上一个物理文件
  • 每个目录引用相同的inode号
  • 创建时链接数递增
  • 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,* 当链接数为零时,该文 件被删除
  • 不能跨越驱动器或分区
  • 不支持对目录创建硬链接

格式:

ln filename [linkname ]

符号 symbolic (或软 soft)链接

一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件 软链接特点

  • 一个符号链接的内容是它引用文件的名称
  • 可以对目录创建软链接
  • 可以跨分区的文件实现
  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
  • 在创建软链接时, 如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目 录,但是软链接的路径如果是相对路径,则是相对于当前工作目录
    格式:
ln -s filename [linkname]

范例: 查看软链接

[root@ubuntu1804 ~]#ll /bin/sh
lrwxrwxrwx 1 root root 4 Nov 1 02:16 /bin/sh -> dash*
root@ubuntu2004:~# ll /bin/sh
lrwxrwxrwx 1 root root 4 Apr 23 2020 /bin/sh -> dash*
[root@centos8 ~]#ll /bin/sh
lrwxrwxrwx. 1 root root 4 Jul 22 2020 /bin/sh -> bash
[root@centos7 ~]#ll /bin/sh
lrwxrwxrwx. 1 root root 4 Mar 14 10:46 /bin/sh -> bash

范例:

#绝对路径
ln -s /data/dir /data/dirlink
#相对路径
cd /data
ln -s ../data/dir /root/dirlink
#查看链接文件指向的原文件
readlink /data/dirlink
[root@centos8 ~]#readlink /proc/$$/exe
/usr/bin/bash

范例: 删除软链接时姿势不对造成的生产事故

rm -rf /data/dirlink #只删除软链接本身,不会删除源目录内容
rm -rf /data/dirlink/ #删除源目录的文件,但不会删除链接文件,此方法非常危险
#注意: 删除此软链接务必不要加-r选项

硬链接和软链接区别总结

  1. 本质:
    硬链接:本质是同一个文件
    软链接:本质不是同一个文件
  2. 跨设备
    硬链接:不支持
    软链接:支持
  3. inode
    硬链接:相同
    软链接:不同
  4. 链接数
    硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少
    软链接:创建或删除,链接数不会变化
  5. 文件夹
    硬链接:不支持
    软链接:支持
  6. 相对路径
    硬链接:原始文件相对路径是相对于当前工作目录
    软链接:原始文件的相对路径是相对于链接文件的相对路径
  7. 删除源文件
    硬链接:只是链接数减一,但链接文件的访问不受影响
    软链接:链接文件将无法访问
  8. 文件类型
    硬链接:和源文件相同
    软链接:链接文件,和源文件无关
  9. 文件大小
    硬链接: 和源文件相同
    软链接: 源文件的路径的长度

补充:Linux文件类型颜色详解

Linux下七种文件类型、文件属性及其查看方法

浅蓝色	[l]	软链接
白色		[-]	普通文件/硬链接
蓝色		[d] 目录
红色 	[l]	某文件被删除后,链接到该文件的软链接的颜色
红色闪烁  无  表示该文件已被删除,但还存在该文件的软链接
红色 	[-] 压缩包
黄色 	[c] 字符设备文件,如键盘鼠标
绿色 	[-] 可执行文件,可执行的程序 
桃红色	[s] 套接字文件
土黄色   [p] 管道文件
灰色文件		表示其它文件

1 1 1 1 1 1 1