原创2021-10-25 09:32·ittimeline

相对路径和绝对路径

文件路径分为绝对路径和相对路径两种类型,其中绝对路径是/开头,是一个文件完整的位置路径,可以用于访问任何一个文件
相对路径不以/开头,一般情况下是相对于当前工作目录,特定场景下相对于某个目录的位置,当前工作目录可以使用pwd命令查看

[root@centos8-1 ~]# ll /etc/sysconfig/network-scripts/ifcfg-ens160 #绝对路径的方式访问查看网卡文件详细信息
-rw-r--r--. 1 root root 248 Oct 20 15:40 /etc/sysconfig/network-scripts/ifcfg-ens160

两种路径方式查看/root目录下的anaconda-ks.cfg文件详细信息

[root@centos8-1 ~]# ll /root/anaconda-ks.cfg  #绝对路径查看/root目录下的anaconda-ks.cfg文件详细信息
-rw-------. 1 root root 1333 Oct 20 15:40 /root/anaconda-ks.cfg
[root@centos8-1 ~]# ll anaconda-ks.cfg   #相对对路径查看/root目录下的anaconda-ks.cfg文件详细信息
-rw-------. 1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
[root@centos8-1 ~]# pwd #查看当前工作目录
/root

两种路径方式查看 /boot目录下的
vmlinuz-4.18.0-305.3.1.el8.x86_64 文件信息

[guanglei@centos8-1 ~]$ ll  /boot/vmlinuz-4.18.0-305.3.1.el8.x86_64  #绝对路径方式查看 /boot目录下的vmlinuz-4.18.0-305.3.1.el8.x86_64 文件信息
-rwxr-xr-x. 1 root root 10026120 Jun  2 00:22 /boot/vmlinuz-4.18.0-305.3.1.el8.x86_64
[guanglei@centos8-1 ~]$ pwd # 查看当前目录
/home/guanglei
[guanglei@centos8-1 ~]$ ll ../../boot/vmlinuz-4.18.0-305.3.1.el8.x86_64  # 相对路径方式查看/boot目录下的vmlinuz-4.18.0-305.3.1.el8.x86_64 文件信息
-rwxr-xr-x. 1 root root 10026120 Jun  2 00:22 ../../boot/vmlinuz-4.18.0-305.3.1.el8.x86_64

相对路径有两个常用的目录,其中.表示当前路径,而…表示当前目录的父目录。

[root@centos8-1 ~]# ll . #查看当前目录的文件列表详细信息
total 158504
-rw-------. 1 root root      1333 Oct 20 15:40 anaconda-ks.cfg
-rw-r--r--. 1 root root      1798 Oct 20 15:42 initial-setup-ks.cfg
-rw-r--r--. 1 root root 162297272 Oct 20 20:55 jdk-17_linux-x64_bin.rpm
[root@centos8-1 ~]# ll .. #查看当前目录的父目录文件列表详细信息
total 24
lrwxrwxrwx.   1 root root    7 Nov  3  2020 bin -> usr/bin
dr-xr-xr-x.   6 root root 4096 Oct 20 15:39 boot
drwxr-xr-x.   2 root root    6 Oct 20 15:31 data
drwxr-xr-x.  18 root root 3120 Oct 23 09:10 dev
drwxr-xr-x. 140 root root 8192 Oct 23 09:10 etc
drwxr-xr-x.   3 root root   22 Oct 20 15:42 home
lrwxrwxrwx.   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Nov  3  2020 media
drwxr-xr-x.   3 root root   18 Oct 20 15:36 mnt
drwxr-xr-x.   2 root root    6 Nov  3  2020 opt
dr-xr-xr-x. 271 root root    0 Oct 23 09:10 proc
dr-xr-x---.   7 root root  286 Oct 23 14:41 root
drwxr-xr-x.  42 root root 1220 Oct 23 10:45 run
lrwxrwxrwx.   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root    0 Oct 23 09:10 sys
drwxrwxrwt.  19 root root 4096 Oct 23 14:51 tmp
drwxr-xr-x.  12 root root  144 Oct 20 15:32 usr
drwxr-xr-x.  21 root root 4096 Oct 20 15:41 var

在日常使用时,如果路径不会变更采用绝对路径,如果路径变更则采用相对路径。生产环境中使用相对路径的应用场景更多。

更改目录

cd命令用于切换到指定的文件夹

[root@centos8-1 ~]# cd /etc/sysconfig/ #切换到/etc/sysconfig目录下
[root@centos8-1 sysconfig]# pwd #查看当前工作目录
/etc/sysconfig

cd …切换到父目录

[root@centos8-1 sysconfig]# cd ..
[root@centos8-1 etc]# pwd
/etc

cd – 切换到上一个目录

[root@centos8-1 etc]# cd - # 切换到上一个目录
/etc/sysconfig
[root@centos8-1 sysconfig]# pwd
/etc/sysconfig

上一个目录由变量$OLDPWD决定

[root@centos8-1 sysconfig]# echo $OLDPWD # 查看上一个目录
/etc

cd或者是cd ~ 切换到用户家目录
root用户的家目录是/root
普通用户的家目录是 /home/username 例如/home/guanglei

[root@centos8-1 sysconfig]# cd ~ #切换到root用户的家目录
[root@centos8-1 ~]# pwd
/root
[guanglei@centos8-1 ~]$ pwd
/home/guanglei
[guanglei@centos8-1 ~]$ cd ~  # 切换到普通用户guanglei的家目录
[guanglei@centos8-1 ~]$ pwd
/home/guanglei
[guanglei@centos8-1 ~]$ cd 
[guanglei@centos8-1 ~]$ pwd
/home/guanglei

通过basename 加上路径 可以获取路径的文件名,dirname加上路径可以获取指定文件的路径

[root@centos8-1 sysconfig]# basename /etc/sysconfig/network-scripts/ifcfg-ens160  #获取指定路径的文件名
ifcfg-ens160 
[root@centos8-1 sysconfig]# dirname /etc/sysconfig/network-scripts/ifcfg-ens160  # 获取指定文件的路径
/etc/sysconfig/network-scripts

列出目录内容

ls命令的作用是可以列出当前目录内容或者指定的目录

ls命令的用法是 ls [选项] [文件或者目录]

ls命令的选项及其说明如下

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

ls命令的应用

查看root用户家目录的文件信息

[root@centos8-1 ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg2.查看root用户家目录的文件信息,包含隐藏文件

查看root用户家目录的文件信息,包含隐藏文件

[root@centos8-1 ~]# ls -a
.                .bash_history  .bashrc  .cshrc                .local    .Xauthority
..               .bash_logout   .cache   .dbus                 .mozilla
anaconda-ks.cfg  .bash_profile  .config  initial-setup-ks.cfg  .tcshrc

查看root用户家目录的anaconda-ks.cfg 文件详细信息

文件的数据是由元数据(meta data)和数据(data)两部分组成,这两部分是分开存放的,元数据包含文件的类型、文件的权限、文件的链接数、所有者、所属组、文件大小和文件的修改时间都是文件的元数据。

其中 -表示该文件是普通文件
第一个root表示该文件的拥有者
第二个root表示该文件的拥有者所在的用户组
Oct 20 15:40表示文件的修改时间,如果没有修改就是系统安装的时间

[root@centos8-1 ~]# ls -l anaconda-ks.cfg 
-rw-------. 1 root root 1333 Oct 20 15:40 anaconda-ks.cfg

每个文件的时间除了修改时间(modify time)以外,还有访问时间(access time)和改变时间(change time),这三个时间都是属于文件的元数据,可以通过stat命令查看文件的元数据信息。

[root@centos8-1 ~]# stat anaconda-ks.cfg 
  File: anaconda-ks.cfg
  Size: 1333      	Blocks: 8          IO Block: 4096   regular file
Device: 10302h/66306d	Inode: 202324239   Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-10-20 15:41:24.397787433 +0800
Modify: 2021-10-20 15:40:42.737352758 +0800
Change: 2021-10-20 15:40:42.737352758 +0800
 Birth: -

当读取文件内容后访问时间(access time)会发生变化,但是不是每次读文件时access time 都会发生变化,而是当时间超过一天以上才会更新,这个是出于性能优化考虑。

[root@centos8-1 ~]# cat anaconda-ks.cfg  # 查看文件内容

[root@centos8-1 ~]# stat anaconda-ks.cfg  # 查看文件访问时间
  File: anaconda-ks.cfg
  Size: 1333      	Blocks: 8          IO Block: 4096   regular file
Device: 10302h/66306d	Inode: 202324239   Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-10-23 18:34:13.046528617 +0800
Modify: 2021-10-20 15:40:42.737352758 +0800
Change: 2021-10-20 15:40:42.737352758 +0800
 Birth: -

除此以外如果修改文件内容,修改时间(modify time)会发生变化,一般情况下访问时间(access time)会被修改时间更新,因为读多写少,但是如果修改时间比访问时间新,那么也会触发访问时间的更新


[root@centos8-1 ~]# echo >> anaconda-ks.cfg  #修改文件内容
[root@centos8-1 ~]# stat anaconda-ks.cfg  # 查看文件的访问时间、修改时间、改变时间
  File: anaconda-ks.cfg
  Size: 1334      	Blocks: 8          IO Block: 4096   regular file
Device: 10302h/66306d	Inode: 202324239   Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-10-23 18:34:13.046528617 +0800
Modify: 2021-10-23 18:41:12.552305021 +0800
Change: 2021-10-23 18:41:12.552305021 +0800
 Birth: -

查看root用户家目录所有文件的详细信息

[root@centos8-1 ~]# ls -al
total 36
dr-xr-x---.  7 root root  254 Oct 23 15:31 .
dr-xr-xr-x. 18 root root  236 Oct 20 15:32 ..
-rw-------.  1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
-rw-------.  1 root root  590 Oct 23 15:31 .bash_history
-rw-r--r--.  1 root root   18 May 11  2019 .bash_logout
-rw-r--r--.  1 root root  176 May 11  2019 .bash_profile
-rw-r--r--.  1 root root  236 Oct 20 21:13 .bashrc
drwx------.  5 root root   59 Oct 20 21:20 .cache
drwx------.  7 root root   74 Oct 20 21:20 .config
-rw-r--r--.  1 root root  100 May 11  2019 .cshrc
drwx------.  3 root root   25 Oct 20 15:41 .dbus
-rw-r--r--.  1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg
drwxr-xr-x.  3 root root   19 Oct 20 19:54 .local
drwxr-xr-x.  5 root root   66 Oct 20 21:20 .mozilla
-rw-r--r--.  1 root root  129 May 11  2019 .tcshrc
-rw-------.  1 root root  278 Oct 23 15:09 .Xauthority

查看root用户家目录所有文件的详细信息,按照文件从大到小排序

[root@centos8-1 ~]# ls -alS 
total 36
-rw-r--r--.  1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg
-rw-------.  1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
-rw-------.  1 root root  590 Oct 23 15:31 .bash_history
-rw-------.  1 root root  278 Oct 23 15:09 .Xauthority
dr-xr-x---.  7 root root  254 Oct 23 15:31 .
dr-xr-xr-x. 18 root root  236 Oct 20 15:32 ..
-rw-r--r--.  1 root root  236 Oct 20 21:13 .bashrc
-rw-r--r--.  1 root root  176 May 11  2019 .bash_profile
-rw-r--r--.  1 root root  129 May 11  2019 .tcshrc
-rw-r--r--.  1 root root  100 May 11  2019 .cshrc
drwx------.  7 root root   74 Oct 20 21:20 .config
drwxr-xr-x.  5 root root   66 Oct 20 21:20 .mozilla
drwx------.  5 root root   59 Oct 20 21:20 .cache
drwx------.  3 root root   25 Oct 20 15:41 .dbus
drwxr-xr-x.  3 root root   19 Oct 20 19:54 .local
-rw-r--r--.  1 root root   18 May 11  2019 .bash_logout

查看root用户家目录所有文件的详细信息,按照文件从小到大排序

[root@centos8-1 ~]# ls -laSr
total 36
-rw-r--r--.  1 root root   18 May 11  2019 .bash_logout
drwxr-xr-x.  3 root root   19 Oct 20 19:54 .local
drwx------.  3 root root   25 Oct 20 15:41 .dbus
drwx------.  5 root root   59 Oct 20 21:20 .cache
drwxr-xr-x.  5 root root   66 Oct 20 21:20 .mozilla
drwx------.  7 root root   74 Oct 20 21:20 .config
-rw-r--r--.  1 root root  100 May 11  2019 .cshrc
-rw-r--r--.  1 root root  129 May 11  2019 .tcshrc
-rw-r--r--.  1 root root  176 May 11  2019 .bash_profile
-rw-r--r--.  1 root root  236 Oct 20 21:13 .bashrc
dr-xr-xr-x. 18 root root  236 Oct 20 15:32 ..
dr-xr-x---.  7 root root  254 Oct 23 15:31 .
-rw-------.  1 root root  278 Oct 23 15:09 .Xauthority
-rw-------.  1 root root  590 Oct 23 15:31 .bash_history
-rw-------.  1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
-rw-r--r--.  1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg

查看root用户家目录所有文件的详细信息,按照文件的修改时间从大到小排序

[root@centos8-1 ~]# ls -alt
total 36
dr-xr-x---.  7 root root  254 Oct 23 15:31 .
-rw-------.  1 root root  590 Oct 23 15:31 .bash_history
-rw-------.  1 root root  278 Oct 23 15:09 .Xauthority
drwxr-xr-x.  5 root root   66 Oct 20 21:20 .mozilla
drwx------.  5 root root   59 Oct 20 21:20 .cache
drwx------.  7 root root   74 Oct 20 21:20 .config
-rw-r--r--.  1 root root  236 Oct 20 21:13 .bashrc
drwxr-xr-x.  3 root root   19 Oct 20 19:54 .local
-rw-r--r--.  1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg
drwx------.  3 root root   25 Oct 20 15:41 .dbus
-rw-------.  1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
dr-xr-xr-x. 18 root root  236 Oct 20 15:32 ..
-rw-r--r--.  1 root root   18 May 11  2019 .bash_logout
-rw-r--r--.  1 root root  176 May 11  2019 .bash_profile
-rw-r--r--.  1 root root  100 May 11  2019 .cshrc
-rw-r--r--.  1 root root  129 May 11  2019 .tcshrc

查看/etc文件夹的详细信息,不显示文件夹的文件。

[root@centos8-1 ~]# ls -ld /etc/
drwxr-xr-x. 140 root root 8192 Oct 23 09:10 /etc/

递归查看/etc文件夹的子文件夹详细信息

[root@centos8-1 ~]# ls -lR /etc/

使用对不同类型文件显示时附加不同的符号 查看根目录

[root@centos8-1 ~]# ls -F /
bin@   data/  etc/   lib@    media/  opt/   root/  sbin@  sys/  usr/
boot/  dev/   home/  lib64@  mnt/    proc/  run/   srv/   tmp/  var/

文本管理命令

创建空文件和刷新时间

touch命令可以用来创建空文件和刷新文件的修改时间

[root@centos8-1 data]# touch test.txt # 创建test.txt
[root@centos8-1 data]# ll test.txt # 查看test.txt文件信息
-rw-r--r--. 1 root root 0 Oct 24 12:48 test.txt 
[root@centos8-1 data]# stat test.txt
  File: test.txt
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 10303h/66307d   Inode: 183         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-10-24 12:48:02.579812141 +0800
Modify: 2021-10-24 12:48:02.579812141 +0800
Change: 2021-10-24 12:48:02.579812141 +0800
 Birth: -
[root@centos8-1 data]# touch test.txt
[root@centos8-1 data]# ll /etc/issue
-rw-r--r--. 1 root root 23 May 27 21:20 /etc/issue
[root@centos8-1 data]# touch /etc/issue # 如果使用touch创建的文件存在,则会更新文件的修改时间
[root@centos8-1 data]# ll /etc/issue
-rw-r--r--. 1 root root 23 Oct 24 12:48 /etc/issue

除了touch可以创建文件以外,> 也可以创建文件。但是需要注意的是使用>创建文件,如果文件中有数据,那么数据会被清空,而touch只会更新文件的修改时间。


[root@centos8-1 data]# >  data.txt # 创建data.txt
[root@centos8-1 data]# ll data.txt
-rw-r--r--. 1 root root 0 Oct 24 12:50 data.txt

touch的案例:使用touch创建去年的日志文件


[root@centos8-1 data]# touch $(date -d "1 year" +%F_%T).log
[root@centos8-1 data]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 24 12:54 2022-10-24_12:54:51.log

touch的案例:使用touch根据当前日期创建文件

[root@centos8-1 data]# touch nginx_access_`date +%F`.log
[root@centos8-1 data]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 24 12:56 nginx_access_2021-10-24.log

复制文件和目录

使用cp(copy)命令可以实现文件复制,主要用于数据的备份,也就是将数据复制一份,原数据如果误删以后使用复制的数据即可。资深Linux运维工程师必须掌握的文件管理命令

查看cp命令的帮助


cp命令的2种使用方式

  1. cp [option]… source dest 用于将一个文件复制到另外一个路径,可以改名,dest 就是改名后的路径
  2. cp [option]… source… directory 用于将多个文件复制到文件夹

首先使用普通账号guanglei登录CentOS8.4,然后在家目录创建文本文件guanglei.txt


[guanglei@centos8-1 ~]$ touch guanglei.txt
[guanglei@centos8-1 ~]$ ll guanglei.txt
-rw-rw-r--. 1 guanglei guanglei 0 Oct 24 13:09 guanglei.txt

然后再使用root账号将刚才创建的guanglei.txt文件拷贝到/data/guanglei.txt.bak,此时文件重命名为guanglei.txt.bak

[root@centos8-1 data]# cp ~guanglei/guanglei.txt  /data/guanglei.txt.bak

但是使用查看两个文件的属性信息时发现guanglei.txt.bak文件的所属用户和用户组是root而不是guanglei

[root@centos8-1 data]# ll !*
ll ~guanglei/guanglei.txt /data/guanglei.txt.bak
-rw-r--r--. 1 root     root     0 Oct 24 13:11 /data/guanglei.txt.bak
-rw-rw-r--. 1 guanglei guanglei 0 Oct 24 13:09 /home/guanglei/guanglei.txt

拷贝文件名时通常想要保存文件的属性信息,添加-a选项即可


[root@centos8-1 data]# cp -a ~guanglei/guanglei.txt /data/guanglei.txt
[root@centos8-1 data]# ll !*
ll -a ~guanglei/guanglei.txt /data/guanglei.txt
-rw-rw-r--. 1 guanglei guanglei 0 Oct 24 13:09 /data/guanglei.txt
-rw-rw-r--. 1 guanglei guanglei 0 Oct 24 13:09 /home/guanglei/guanglei.txt

在使用cp复制字符设备文件时,一定要加上-a属性,否则你会发现拷贝后文件类型由拷贝前的字符设备变成了拷贝后的普通文件。

[root@centos8-1 ~]# cp /dev/zero  /data/ # 没有使用-a属性拷贝字符设备文件
^C
[root@centos8-1 ~]# ll !* 
ll /dev/zero /data/
crw-rw-rw-. 1 root root 1, 5 Oct 23 18:00 /dev/zero

/data/:
total 1611676
-rw-r--r--. 1 root root 1650356224 Oct 24 16:21 zero

而cp加上-a选项后可以正常拷贝字符设备文件

[root@centos8-1 ~]# \cp -a /dev/zero  /data/

[root@centos8-1 ~]# ll /dev/zero /data/zero
crw-rw-rw-. 1 root root 1, 5 Oct 23 18:00 /data/zero
crw-rw-rw-. 1 root root 1, 5 Oct 23 18:00 /dev/zero

当拷贝链接文件时,默认拷贝的不是链接文件本身,而是链接文件指向的原始文件本身。


[root@centos8-1 data]# ll /etc/grub2.cfg
lrwxrwxrwx. 1 root root 22 Mar  3  2021 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
[root@centos8-1 data]# cp /etc/grub2.cfg  /data
[root@centos8-1 data]# ll /data/
total 8
-rw-r--r--. 1 root root 6426 Oct 24 13:27 grub2.cfg


[root@centos8-1 data]# ll /boot/grub2/grub.cfg
-rw-r--r--. 1 root root 6426 Oct 20 15:39 /boot/grub2/grub.cfg

通过-d选项实现拷贝链接文件时如果只需要拷贝链接文件而不是指向的原始文件

[root@centos8-1 data]# cp -d /etc/grub2.cfg  /data
cp: overwrite '/data/grub2.cfg'? y
[root@centos8-1 data]# ll /data
total 0
lrwxrwxrwx. 1 root root 22 Oct 24 13:29 grub2.cfg -> ../boot/grub2/grub.cfg

通过-r选项实现拷贝文件夹

[root@centos8-1 data]# cp -r  /etc/ /data/etc # 将/etc文件夹拷贝到/data目录下
[root@centos8-1 data]# ll -d /data/etc
drwxr-xr-x. 140 root root 8192 Oct 24 13:30 /data/etc

但是如果再次执行cp -r /etc/ /data/etc时,此时就是将/etc目录拷贝到/datat/etc目录下

[root@centos8-1 data]# cp -r  /etc/ /data/etc
[root@centos8-1 data]# ll -d /data/etc/etc
drwxr-xr-x. 140 root root 8192 Oct 24 13:35 /data/etc/etc

这就说明cp命令不具备幂等性,所谓的幂等性就是执行多次操作结果相同。

当执行cp命令时,cp实际上是一个别名,也就是默认会添加 -i选项,因此每次拷贝时如果文件存在,系统会提示是否覆盖文件。


[root@centos8-1 data]# alias cp
alias cp='cp -i'

如果不想要提示是否覆盖的话,使用原始命令(也就是在命令前面加)即可。

[root@centos8-1 data]# \cp -r /etc/ /data/etc # 使用原始cp命令将/etc目录拷贝到/data/etc目录下,不用提示文件存在是否覆盖文件

cp的案例:两种备份配置文件的方式

[root@centos8-1 data]# touch nginx.conf   
[root@centos8-1 data]# cp -a nginx.conf  nginx.conf.bak  # 方式1
[root@centos8-1 data]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 24 13:46 nginx.conf
-rw-r--r--. 1 root root 0 Oct 24 13:46 nginx.conf.bak
[root@centos8-1 data]# \cp -a nginx.conf{,.bak}  方式2 因为考虑到会提示覆盖,所以使用了原始命令
[root@centos8-1 data]#
[root@centos8-1 data]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 24 13:46 nginx.conf
-rw-r--r--. 1 root root 0 Oct 24 13:46 nginx.conf.bak

cp命令的选项中还有比较常用的-u选项,其作用是复制源比目标更新的文件或者目标不存在的文件,也就是源(source)比目标(dest)更加新才会覆盖。

cp命令在复制文件时,如果文件已经存在,系统会提示是否覆盖,输入y表示覆盖,如果想要在覆盖之前备份,那么就通过cp命令的-b选项实现,不过这个备份只能备份一次。

[root@centos8-1 ~]# cp /etc/issue /data/issue.bak
[root@centos8-1 ~]# cp /etc/issue /data/issue.bak
cp: overwrite '/data/issue.bak'? y
[root@centos8-1 ~]# cp -b /etc/passwd /data/issue.bak #覆盖之前先备份
cp: overwrite '/data/issue.bak'? y
[root@centos8-1 ~]# ll /data
total 8
-rw-r--r--. 1 root root 2560 Oct 24 15:49 issue.bak
-rw-r--r--. 1 root root   23 Oct 24 15:49 issue.bak~ # 备份文件

通过cp 命令的长选项–backup=numbered 可以在覆盖前备份多次,备份的文件会加上数字后缀。

[root@centos8-1 ~]# cp --backup=numbered /etc/redhat-release  /data/redhat-release.bak
[root@centos8-1 ~]# cp --backup=numbered /etc/redhat-release  /data/redhat-release.bak
cp: overwrite '/data/redhat-release.bak'? y
[root@centos8-1 ~]# cp --backup=numbered /etc/redhat-release  /data/redhat-release.bak
cp: overwrite '/data/redhat-release.bak'? y
[root@centos8-1 ~]# ll
total 0
[root@centos8-1 ~]# ll /data
total 20
-rw-r--r--. 1 root root  984 Oct 24 15:50 issue.bak
-rw-r--r--. 1 root root 2560 Oct 24 15:49 issue.bak~
-rw-r--r--. 1 root root   30 Oct 24 15:51 redhat-release.bak
-rw-r--r--. 1 root root   30 Oct 24 15:51 redhat-release.bak.~1~
-rw-r--r--. 1 root root   30 Oct 24 15:51 redhat-release.bak.~2~

使用cp命令复制文件时的规则

源\目标不存在存在且为文件存在且为目录
一个文件新建desc,并将src中内容填充至desc中将src中的内容覆盖至desc中 注意数据丢失风险! 建议用 –i 选项在desc下新建与原文件同名的文件,并将src中内容填充至新文件中
多个文件提示错误提示错误在desc下新建与原文件同名的文件,并将原文件内容复制进新文件中
目录须使用-r选项创建指定desc同名目录,复制src目录中所有文件至desc下提示错误在desc下新建与原目录同名的目录,并将src中内容复制至新目录中

当尝试将一个文件夹复制给文件就会出现错误


[root@centos8-1 ~]# pwd
/root
[root@centos8-1 ~]# touch dir
[root@centos8-1 ~]# cp -r /boot dir
cp: cannot overwrite non-directory 'dir' with directory '/boot'

拷贝文件时在保留属性的前提下还想要看到拷贝到过程可以通过cp命令的av选项实现

[root@centos8-1 data]# touch file{1..9}.txt
[root@centos8-1 data]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 24 16:45 file1.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file2.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file3.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file4.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file5.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file6.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file7.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file8.txt
-rw-r--r--. 1 root root 0 Oct 24 16:45 file9.txt
[root@centos8-1 data]# cp -av /data /root/data
'/data' -> '/root/data'
'/data/file1.txt' -> '/root/data/file1.txt'
'/data/file2.txt' -> '/root/data/file2.txt'
'/data/file3.txt' -> '/root/data/file3.txt'
'/data/file4.txt' -> '/root/data/file4.txt'
'/data/file5.txt' -> '/root/data/file5.txt'
'/data/file6.txt' -> '/root/data/file6.txt'
'/data/file7.txt' -> '/root/data/file7.txt'
'/data/file8.txt' -> '/root/data/file8.txt'
'/data/file9.txt' -> '/root/data/file9.txt'

cp命令的案例:实现按天备份指定目录的数据

生产环境的关键数据备份都是跨机房,跨城市,甚至是跨过家的多份备份,因为生产环境的数据就是公司的生命


[root@centos8-1 ~]# cp -a /etc /data/etc_`date +%F` # 按天备份/etc目录到/data目录下
[root@centos8-1 ~]# ll /data/
total 12
drwxr-xr-x. 140 root root 8192 Oct 24 09:04 etc_2021-10-24

移动和重命名文件

mv(move)命令可以实现文件的移动(类似Windows下的剪切)或者是重名,和复制不同的是文件移动之后原来的文件就不存在。
由于删除操作具有一定的危险性,在线上运维环境中通常使用mv代替rm命令。资深Linux运维工程师必须掌握的文件管理命令

查看mv命令的帮助


mv实现文件的移动

[root@centos8-1 data]# pwd
/data
[root@centos8-1 data]# touch test.txt
[root@centos8-1 data]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 24 16:39 test.txt
[root@centos8-1 data]# mv test.txt  /root/test.txt
[root@centos8-1 data]# ll
total 0
[root@centos8-1 data]# ll /root
total 0
-rw-r--r--. 1 root root 0 Oct 24 16:39 test.txt

mv实现文件的重命名


[root@centos8-1 data]# mv /root/test.txt  /root/test_data.txt
[root@centos8-1 data]# ll /root/test_data.txt
-rw-r--r--. 1 root root 0 Oct 24 16:39 /root/test_data.txt

mv实现移动文件夹

guanglei@ubuntu1804-1:~$ pwd
/home/guanglei
guanglei@ubuntu1804-1:~$ mkdir test
guanglei@ubuntu1804-1:~$ cd test/
guanglei@ubuntu1804-1:~/test$ touch file{1..9}.txt
guanglei@ubuntu1804-1:~/test$ mv /home/guanglei/test/ /tmp
guanglei@ubuntu1804-1:~/test$ ll /tmp/test/
total 8
drwxrwxr-x  2 guanglei guanglei 4096 Oct 24 17:13 ./
drwxrwxrwt 11 root     root     4096 Oct 24 17:13 ../
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file1.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file2.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file3.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file4.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file5.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file6.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file7.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file8.txt
-rw-rw-r--  1 guanglei guanglei    0 Oct 24 17:13 file9.txt

mv在进行文件重命名时只能同时修改一个文件,如果想要同时对多个文件进行重命名,可以使用rename命令实现

[root@centos8-1 ~]# cd /data/
[root@centos8-1 data]# ls
file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  file6.txt  file7.txt  file8.txt  file9.txt
[root@centos8-1 data]# rename txt txt.bak *.txt #将.txt结尾的改成.txt.bak结尾
[root@centos8-1 data]# ls
file1.txt.bak  file2.txt.bak  file3.txt.bak  file4.txt.bak  file5.txt.bak  file6.txt.bak  file7.txt.bak  file8.txt.bak  file9.txt.bak

[root@centos8-1 data]# rename .txt.bak .txt   *.bak #将.txt.bak改成.txt
[root@centos8-1 data]# ls
file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  file6.txt  file7.txt  file8.txt  file9.txt

删除文件

在Windows系统中删除文件,系统会将删除的文件放到回收站中。
而linux系统的删除使用rm命令,但是是没有回收站。因此在删除文件时一定需要小心操作,以免造成严重的后果。
很多公司生产环境出于安全考虑都是禁用rm命令,或者是使用mv代替rm。

默认的rm命令是别名

[root@centos8-1 data]# type rm
rm is aliased to `rm -i'

在删除文件时系统会提示是否确认删除

[root@centos8-1 data]# rm file1.txt #删除/data目录下的file1.txt
rm: remove regular empty file 'file1.txt'? y
[root@centos8-1 data]# ls
file2.txt  file3.txt  file4.txt  file5.txt  file6.txt  file7.txt  file8.txt  file9.txt

删除文件夹时使用 rm -rf,因为默认的rm删除文件每次都需要确认删除,f表示强制删除,r表示递归删除,即删除目录的文件后再删除目录。

[root@centos8-1 data]# touch file{1..9}.txt #创建9个文本文件
[root@centos8-1 data]# mkdir test
[root@centos8-1 data]# mv *.txt ./test # 将所有的文本文件复制到/data/test目录下
[root@centos8-1 data]# ll test
total 0
-rw-r--r--. 1 root root 0 Oct 24 16:54 file1.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file2.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file3.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file4.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file5.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file6.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file7.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file8.txt
-rw-r--r--. 1 root root 0 Oct 24 16:54 file9.txt
[root@centos8-1 data]# rm -rf test
[root@centos8-1 data]# ll
total 0

在生产环境使用rm -rf –no-preserve-root 可以将系统的数据全部删掉,这就等于自杀行为,生产环境是绝对不允许的。

在执行该命令以后会发现有些目录是无法删除,例如/proc目录


[root@centos8-1 data]# rm -rf  --no-preserve-root  /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe

不过这里是本地环境的虚拟机安装的系统,而且有VMware WorkStation的快照可以还原系统


使用快照回退到系统初始化安装的状态以后系统又可以正常使用

不过此时的终端软件需要重新连接系统才能使用

自CentOS6以后无法使用rm -rf /自杀,系统会提示你需要加上–no-preserve-root ,但是需要注意的是使用rm -rf /*系统是不会阻止你

[root@centos8-1 ~]# rm -rf /
^[[Hrm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe

在使用rm删除文件时可能会遇到一些无法正常删除 文件,比如说 想要删除一个名为 -f的文件,可以使用 rm — -f删除


[root@centos8-1 ~]#  touch -- -f # 创建名为-f的文件

[root@centos8-1 ~]# ll
total 8
-rw-------. 1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
-rw-r--r--. 1 root root    0 Oct 24 18:01 -f
-rw-r--r--. 1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg


[root@centos8-1 ~]# rm -- -f
rm: remove regular empty file '-f'? y
[root@centos8-1 ~]# ll
total 8
-rw-------. 1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
-rw-r--r--. 1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg

另外一种方式


[root@centos8-1 ~]# touch ./-f
[root@centos8-1 ~]# ll
total 8
-rw-------. 1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
-rw-r--r--. 1 root root    0 Oct 24 18:07 -f
-rw-r--r--. 1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg
[root@centos8-1 ~]# rm -f ./-f
[root@centos8-1 ~]# ll
total 8
-rw-------. 1 root root 1333 Oct 20 15:40 anaconda-ks.cfg
-rw-r--r--. 1 root root 1798 Oct 20 15:42 initial-setup-ks.cfg

在使用rm删除文件时即使文件正在使用也是可以删除,但是不会释放占用的磁盘空间。

首先将字符设备文件zero复制到/boot/bigfile.img目录下,由于boot分区只有2G,因此系统会提示没有可用的磁盘空间

[root@centos8-1 ~]# cp /dev/zero  /boot/bigfile.img # 将字符设备文件zero复制到/boot/bigfile.img目录下
cp: error writing '/boot/bigfile.img': No space left on device

使用dh -h /boot可以查看磁盘的使用情况,其中已使用是100%


[root@centos8-1 ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  2.0G  1.9G     0 100% /boot

如果生产环境磁盘满了可能会导致某些服务出现问题,因此此时我们需要将/boot的bigfile.img文件删除。但是bigfile.img文件可能被其他程序正在使用,例如这里新开了个会话窗口,然后执行命令 vim /boot/bigfile.img使用vim编辑该文件

[root@centos8-1 ~]# vim /boot/bigfile.img # 编辑 bigfile.img

然后在原来会话窗口中使用rm -rf 删除/boot/bigfile.img,虽然文件可以删除,但是它所占用的磁盘空间仍然不会发生变化


[root@centos8-1 ~]# rm -f /boot/bigfile.img
[root@centos8-1 ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  2.0G  1.9G     0 100% /boot


[root@centos8-1 ~]# ll -Sh /boot #
total 178M
-rw-------. 1 root root 104M Oct 20 15:38 initramfs-0-rescue-d24f75ce89d4414ebefe09d0aa19f262.img
-rw-------. 1 root root  51M Oct 20 15:40 initramfs-4.18.0-305.3.1.el8.x86_64.img
-rwxr-xr-x. 1 root root 9.6M Oct 20 15:38 vmlinuz-0-rescue-d24f75ce89d4414ebefe09d0aa19f262
-rwxr-xr-x. 1 root root 9.6M Jun  2 00:22 vmlinuz-4.18.0-305.3.1.el8.x86_64
-rw-------. 1 root root 4.0M Jun  2 00:22 System.map-4.18.0-305.3.1.el8.x86_64
-rw-r--r--. 1 root root 188K Jun  2 00:22 config-4.18.0-305.3.1.el8.x86_64
drwx------. 2 root root  16K Oct 20 15:31 lost+found
drwxr-xr-x. 3 root root 4.0K Oct 20 15:32 efi
drwx------. 4 root root 4.0K Oct 24 17:42 grub2
drwxr-xr-x. 3 root root 4.0K Oct 20 15:36 loader

如果想知道是哪个程序占用了之前删除的bigfile.img,可以使用 lsof |grep delete命令查看,如果这个程序可以关(关了对业务没有影响)那么就可以使用kill -9 26282 关闭该程序释放磁盘空间

[root@centos8-1 ~]# lsof |grep delete
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.

vim       26282                           root    5r      REG              259,1 1831391232        314 /boot/bigfile.img (deleted)

如果想知道另外一个窗口是谁使用的可以通过w命令查看

[root@centos8-1 ~]# w
 18:51:52 up  1:11,  3 users,  load average: 1.00, 0.71, 0.33
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
guanglei tty2     tty2             Wed16    4days 17.93s  0.02s /usr/libexec/gsd-disk-utility-notify
root     pts/0    10.0.0.1         17:42    0.00s  0.12s  0.01s w
root     pts/1    10.0.0.1         18:44    3:09   5:57   5:57  vim /boot/bigfile.img

这里的解决办法目前是只有关闭另外一个会话窗口后,才会释放磁盘空间,不过还有更好的两种删除文件会立即释放磁盘空间的方式


[root@centos8-1 ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  2.0G  190M  1.7G  11% /boot

方式1 :想要删除文件时立即释放文件占据的磁盘空间,可以使用>实现清空文件内容,然后再使用rm删除即可

[root@centos8-1 ~]# cp /dev/zero  /boot/bigfile.img # 将字符设备文件zero复制到/boot/bigfile.img目 录下
cp: error writing '/boot/bigfile.img': No space left on device
[root@centos8-1 ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  2.0G  1.9G     0 100% /boot
[root@centos8-1 ~]# > /boot/bigfile.img
[root@centos8-1 ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  2.0G  190M  1.7G  11% /boot
[root@centos8-1 ~]# rm -f /boot/bigfile.img

不过 > 是依赖bash shell,如果你使用其他的shell,那么可能不支持该用法。

方式2:这里再给出一种通用的情况文件内容的方法,也就是cat /dev/null > /boot/bigfile.img;rm -f /boot/bigfile.img


[root@centos8-1 ~]# cp /dev/zero  /boot/bigfile.img # 将字符设备文件zero复制到/boot/bigfile.img目录下
cp: error writing '/boot/bigfile.img': No space left on device
[root@centos8-1 ~]# cat /dev/null > /boot/bigfile.img
[root@centos8-1 ~]# rm -f /boot/bigfile.img

[root@centos8-1 ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  2.0G  190M  1.7G  11% /boot

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

shred命令的选项说明

  • -z 最后一次覆盖添加0,以隐藏覆盖操作
  • -v 能够显示操作进度
  • -u 覆盖后截断并删除文件
  • -n # 指定覆盖文件内容的次数(默认是3次)

shred命令的使用

[root@centos8-1 ~]# cd /data
[root@centos8-1 data]# touch test.txt
[root@centos8-1 data]# shred -zvun 5 test.txt # 安全删除test.txt
shred: test.txt: removing
shred: test.txt: renamed to 00000000
shred: 00000000: renamed to 0000000
shred: 0000000: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: test.txt: removed
[root@centos8-1 data]# ll
total 0

目录操作

tree命令会以树形结构显示目录下的文件,如果是最小化安装系统需要使用yum install -y tree安装tree

[root@centos8-1 data]# yum install -y tree

tree命令常用的选项

  • -d 只显示文件夹
  • -L level 显示指定的层级
  • -P pattern 只显示由指定的pattern匹配到的路径

[root@centos8-1 ~]# tree -d /boot # 查看/boot目录下的结构 如果是文件夹显示文件夹本身
/boot
├── efi
│   └── EFI
│       └── centos
├── grub2
│   ├── fonts
│   └── i386-pc
├── loader
│   └── entries
└── lost+found

9 directories

查看/boot下的一级目录


[root@centos8-1 ~]#  tree -d /boot -L 1
/boot
├── efi
├── grub2
├── loader
└── lost+found

4 directories

mkdir用于创建目录,默认只能创建一级目录

[root@centos8-1 data]# mkdir test # 创建test目录
[root@centos8-1 data]# ll
total 0
drwxr-xr-x. 2 root root 6 Oct 25 09:13 test

如果创建多级目录会提示目录不存在

[root@centos8-1 data]# mkdir dir1/dir2
mkdir: cannot create directory ‘dir1/dir2’: No such file or directory

想要创建多级目录,mkdir加上-p选项即可,同时-v选项可以显示创建过程


[root@centos8-1 data]# mkdir -pv dir1/dir2/dir3
mkdir: created directory 'dir1'
mkdir: created directory 'dir1/dir2'
mkdir: created directory 'dir1/dir2/dir3'
[root@centos8-1 data]# tree dir1
dir1
└── dir2
    └── dir3

2 directories, 0 files

还可以结合{}实现创建多个目录


[root@centos8-1 data]# mkdir -pv mysql/{data,logs,etc}
mkdir: created directory 'mysql'
mkdir: created directory 'mysql/data'
mkdir: created directory 'mysql/logs'
mkdir: created directory 'mysql/etc'
[root@centos8-1 data]# tree mysql
mysql
├── data
├── etc
└── logs

3 directories, 0 files

rmdir命令用于删除空目录


[root@centos8-1 data]# rmdir mysql # mysql下还有logs,etc,data三个子目录,因此不为空,不能删除
rmdir: failed to remove 'mysql': Directory not empty

只能进入到mysql目录下然后将它的子目录一个一个删除


[root@centos8-1 data]# cd mysql
[root@centos8-1 mysql]# rmdir data
[root@centos8-1 mysql]# rmdir logs
[root@centos8-1 mysql]# rmdir etc

然后退回到上一级目录,删除mysql即可


[root@centos8-1 mysql]# cd ..
[root@centos8-1 data]# rmdir mysql

由此可见rmdir删除目录时非常麻烦,而且只能是删除空目录,一般都会使用rm -rf删除目录


[root@centos8-1 data]# mkdir -pv mysql/{data,logs,etc} # 创建测试目录
mkdir: created directory 'mysql'
mkdir: created directory 'mysql/data'
mkdir: created directory 'mysql/logs'
mkdir: created directory 'mysql/etc'
[root@centos8-1 data]# rm -rf mysql #删除mysql以及mysql的子目录及其文件
[root@centos8-1 data]# ll
total 0
drwxr-xr-x. 3 root root 18 Oct 25 09:14 dir1
drwxr-xr-x. 2 root root  6 Oct 25 09:13 test

作者 jyleej

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注