zoukankan      html  css  js  c++  java
  • 跟光磊学Linux运维-Linux文件管理命令实战

    跟光磊学Linux运维-Linux文件管理命令实战

    目录管理

    显示当前工作目录

    在访问文件目录时,想要知道当前的目录,可以使用pwd命令显示

    [root@centos8 data]# pwd
    /data
    [root@centos8 data]# cd /etc/sysconfig/network-scripts/
    [root@centos8 network-scripts]# pwd
    /etc/sysconfig/network-scripts
    

    pwd 默认显示的时链接路径,如果想要查看真实的物理路径,可以使用pwd -P选项。

    [root@centos8 network-scripts]# cd /bin
    [root@centos8 bin]# pwd
    /bin
    [root@centos8 bin]# pwd -P
    /usr/bin
    

    查看目录树

    tree命令会以树形结构显示目录下的文件

    tree命令常用的选项

    • -d 只显示文件夹
    • -L level 显示指定的层级
    • -P pattern 只显示由指定的pattern匹配到的路径
    [root@centos8 ~]# tree -d /boot
    /boot
    ├── efi
    │   └── EFI
    │       └── centos
    ├── grub2
    │   ├── fonts
    │   └── i386-pc
    ├── loader
    │   └── entries
    └── lost+found
    
    9 directories
    
    

    使用tree命令查看根目录下的一级子目录

    [root@centos8 ~]# tree /  -L 1
    /
    ├── bin -> usr/bin
    ├── boot
    ├── data
    ├── dev
    ├── etc
    ├── home
    ├── lib -> usr/lib
    ├── lib64 -> usr/lib64
    ├── media
    ├── mnt
    ├── opt
    ├── proc
    ├── root
    ├── run
    ├── sbin -> usr/sbin
    ├── srv
    ├── sys
    ├── tmp
    ├── usr
    └── var

    查看/boot下的一级目录

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

    创建目录

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

    [root@centos8 data]# ll
    total 0
    [root@centos8 data]# mkdir test
    [root@centos8 data]# ll
    total 0
    drwxr-xr-x. 2 root root 6 Aug  9 11:38 test
    

    如果想要一次性创建多级目录,可以使用mkdir -p实现,因为mkdir不支持一次创建多级子目录

    [root@centos8 data]# mkdir a/b/c
    mkdir: cannot create directory ‘a/b/c’: No such file or directory
    [root@centos8 data]# mkdir -p  a/b/c
    [root@centos8 data]# ll
    total 0
    drwxr-xr-x. 3 root root 15 Aug  9 11:39 a
    drwxr-xr-x. 2 root root  6 Aug  9 11:38 test
    

    使用一条命令创建目录 testdir/dir1/x/a,testdir/dir1/x/b,testdir/dir1/y/a,testdir/dir1/y/b

    [root@centos8 data]# mkdir -p testdir/dir1/{x,y}/{a,b}
    [root@centos8 data]# tree testdir
    testdir
    └── dir1
        ├── x
        │   ├── a
        │   └── b
        └── y
            ├── a
            └── b
    
    7 directories, 0 files
    
    

    切换目录

    在进行系统运维时经常需要在不同的文件目录进行切换,windows和Linux都可以使用cd命令来切换目录,使用cd命令就可以实现目录之间的切换,cd就是change directory的缩写。
    cd命令的使用方式就是cd 后面跟上绝对路径或者是相对路径,例如cd /root表示切换到管理员的家目录

    [root@centos7 ~]# cd /root
    [root@centos7 ~]# pwd
    /root
    

    cd默认切换的是当前登录用户的家目录

    [root@centos7 ~]# cd
    [root@centos7 ~]# pwd
    /root
    

    ~表示当前用户的家目录

    [root@centos7 data]# cd ~
    [root@centos7 ~]# pwd
    /root
    

    cd 切换到普通用户guanglei的家目录

    root用户可以进入普通用户的家目录,而普通用户不能进入root用户的家目录

    [root@centos7 ~]# cd ~guanglei
    [root@centos7 guanglei]# pwd
    /home/guanglei
    

    cd - 切换到上一次目录

    OLDPWD变量保存了上一次的路径

    [root@centos7 ~]# pwd
    /root
    [root@centos7 ~]# cd /data
    [root@centos7 data]# pwd
    /data
    [root@centos7 data]# cd -
    /root
    
    
    [root@centos7 ~]# echo $OLDPWD
    /data

    在Linux系统中,.表示当前目录,..表示上级目录,而cd ..就表示切换到上级目录

    Linux的每个目录下都有.和..

    [root@centos7 ~]# pwd
    /root
    [root@centos7 ~]# cd ..
    [root@centos7 /]# pwd
    /
    

    dirname和basename

    文件的路径包含dirname和basename两部分组成:dirname和basename
    文件所在的目录称为dirname,文件名称为basename

    查看ifcfg-ens33文件的dirname和basename

    [root@centos7 ~]# dirname  /etc/sysconfig/network-scripts/ifcfg-ens33
    /etc/sysconfig/network-scripts
    [root@centos7 ~]# basename  /etc/sysconfig/network-scripts/ifcfg-ens33
    ifcfg-ens33

    目录也是一种文件
    查看/etc/sysconfig/network-scripts/的dirname和basename

    [root@centos7 ~]# dirname /etc/sysconfig/network-scripts/
    /etc/sysconfig
    [root@centos7 ~]# basename /etc/sysconfig/network-scripts/
    network-scripts
    

    删除空目录

    rmdir用于删除空目录

    [root@centos7 ~]# cd /data/
    [root@centos7 data]# mkdir test
    [root@centos7 data]# ll
    total 0
    drwxr-xr-x. 2 root root 6 Aug 29 11:27 test
    [root@centos7 data]# rmdir test/
    [root@centos7 data]# ll
    total 0
    

    列出目录

    在访问Linux文件系统时通常需要查看文件的相关信息,Linux提供了ls命令以及相关的选项来查看文件或者目录的相关信息,ls命令默认使用的是别名

    [root@centos7 ~]# type  ls
    ls is aliased to `ls --color=auto

    在查看文件信息时会给文件增加颜色,如果想使用原命令,可以在ls命令左边加上即可
    ls别名与ls命令对比

    ls命令在使用时会用到一些常用的选项

    • ls -a 显示所有文件,包含隐藏文件
    • ls -l 显示额外的信息,等价于ll
    • ls -R 目录递归
    • ls -ld 查看目录和符号链接信息
    • ls -1 文件分行显示
    • ls -S 按照从大到小排序
    • ls -t 按照mtime排序
    • ls -u 配合-t选项显示并且按照atime从新到旧排序
    • ls -U 按目录存放顺序显示
    • ls -X 按文件后缀排序

    查看root用户家目录的所有文件

    [root@centos7 ~]# ls -a #查看root用户家目录的所有文件
    .   anaconda-ks.cfg  .bash_logout   .bashrc  .config  .dbus                 .tcshrc   .Xauthority
    ..  .bash_history    .bash_profile  .cache   .cshrc   initial-setup-ks.cfg  .viminfo
    

    递归查看/boot目录

    如果/boot目录下有子目录,会依次列出子目录的文件

    [root@centos7 ~]# ls -R /boot #递归查看/boot目录
    

    查看/boot目录的文件属性

    [root@centos8 ~]# ls -l /boot #查看/boot目录的文件属性列表
    total 167444
    -rw-r--r--. 1 root root   187648 May  8 19:07 config-4.18.0-193.el8.x86_64
    drwxr-xr-x. 3 root root     4096 Oct  3 13:41 efi
    drwx------. 4 root root     4096 Oct  3 19:05 grub2
    -rw-------. 1 root root 98497217 Oct  3 13:47 initramfs-0-rescue-f01638e795b44fd88c0431840874f1c9.img
    -rw-------. 1 root root 50995218 Oct  3 13:49 initramfs-4.18.0-193.el8.x86_64.img
    drwxr-xr-x. 3 root root     4096 Oct  3 13:45 loader
    drwx------. 2 root root    16384 Oct  3 13:40 lost+found
    -rw-------. 1 root root  3909996 May  8 19:07 System.map-4.18.0-193.el8.x86_64
    -rwxr-xr-x. 1 root root  8913656 Oct  3 13:46 vmlinuz-0-rescue-f01638e795b44fd88c0431840874f1c9
    -rwxr-xr-x. 1 root root  8913656 May  8 19:07 vmlinuz-4.18.0-193.el8.x86_64
    
    

    查看/boot目录的属性

    ls -l读取的时间是mtime

    [root@centos7 ~]# ls -ld /boot
    dr-xr-xr-x. 5 root root 4096 Aug 25 14:17 /boot
    

    每个文件都有三个时间,分别是mtime,即modify time,ctime,即change time,atime 即access time,其中mtime表示的是文件内容的修改时间,ll默认列出来的时间是mtime,ctime表示文件属性的修改时间,而access time表示文件的读时间。

    如果想要查看atime和ctime,可以使用ll --time=actime和ll --time=ctime查看

    首先在/data目录下创建一个test.txt文件,然后使用ll --time=ctime和ll --time=atime查看文件属性的修改时间和文件的读时间

    [root@centos7 data]# touch test.txt
    [root@centos7 data]# ll --time=ctime test.txt 
    -rw-r--r--. 1 root root 0 Aug 29 12:17 test.txt
    [root@centos7 data]# ll --time=atime test.txt 
    -rw-r--r--. 1 root root 0 Aug 29 12:17 test.txt
    

    然后使用cat命令查看test文件,再查看文件的读时间atime,会发现文件的读时间已经发生变更

    [root@centos7 data]# cat test.txt 
    [root@centos7 data]# ll --time=atime test.txt 
    -rw-r--r--. 1 root root 0 Aug 29 12:18 test.txt
    

    ctime可以使用chown guanglei test.txt命令将test.txt文件的所有者改成guanglei,然后在使用ll -ctime test.txt查看文件的属性修改时间

    [root@centos7 data]# chown guanglei test.txt 
    [root@centos7 data]# ll --time=ctime test.txt 
    -rw-r--r--. 1 guanglei root 0 Aug 29 12:21 test.txt
    

    使用echo "this is test content" > test.txt 给test文件增加内容,此时mtime也会发生变化

    [root@centos7 data]# echo "this is test content" > test.txt 
    [root@centos7 data]# ll test.txt 
    -rw-r--r--. 1 guanglei root 21 Aug 29 12:34 test.txt
    3.

    由于test.txt文件内容大小发生了变化。因此ctime也会发生变化

    [root@centos7 data]# ll --time=ctime test.txt 
    -rw-r--r--. 1 guanglei root 21 Aug 29 12:34 test.txt

    文件状态

    stat命令可以一次性查看文件的三个时间以及其他相关信息

    [root@centos7 data]# stat test.txt 
      File: ‘test.txt’
      Size: 21        	Blocks: 8          IO Block: 4096   regular file
    Device: 803h/2051d	Inode: 67          Links: 1
    Access: (0644/-rw-r--r--)  Uid: ( 1000/guanglei)   Gid: (    0/    root)
    Context: unconfined_u:object_r:etc_runtime_t:s0
    Access: 2020-08-29 12:18:22.951420707 +0800
    Modify: 2020-08-29 12:34:54.298378239 +0800
    Change: 2020-08-29 12:34:54.298378239 +0800
     Birth: -
    

    file命令可以查看文件类型

    Linux不区分文件后缀,例如ls和ls.txt都是可执行文件,ls.txt是ls重命名来的,而虽然后缀是.txt,依然可以使用ls.txt来查看文件信息
    使用file 查看/bin/ls.txt时,显示输出该文件是可执行文件

    [root@centos7 data]# mv /bin/ls /bin/ls.txt
    [root@centos7 data]# ls.txt test.txt 
    test.txt
    [root@centos7 data]# file /bin/ls.txt
    /bin/ls.txt: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aaf05615b6c91d3cbb076af81aeff531c5d7dfd9, stripped
    

    file查看文件类型为可执行程序
    file -b可以不显示文件名称

    [root@centos8 data]# file -b /bin/file
    ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1665f7bdcdba1ee47a69e75e5ae3200fda9d35dc, stripped
    

    使用file查看Linux中常用文件类型的文件信息

    [root@centos7 data]# file /root/anaconda-ks.cfg 
    /root/anaconda-ks.cfg: ASCII text
    
    [root@centos7 data]# file /root/
    /root/: directory
    
    
    [root@centos7 data]# file /bin
    /bin: symbolic link to `usr/bin'
    
    
    [root@centos7 data]# file /dev/zero
    /dev/zero: character special
    
    [root@centos7 data]# file /dev/sda
    /dev/sda: block special
    
    [root@centos7 data]# file /run/autofs.fifo-net 
    /run/autofs.fifo-net: fifo (named pipe)
    
    [root@centos7 data]# file /run/rpcbind.sock 
    /run/rpcbind.sock: socket
    
    

    file还提供了-f 选项,用于批量查看文件类型

    首先使用touch命令创建一个文件file.txt,然后使用nano编辑器编辑如下内容
    file.txt

    编辑文件时不要有空格或者是换行,否则使用file命令读取文件内容会读取失败!!!

    /root/anaconda-ks.cfg
    /root
    /bin
    /dev/zero
    /dev/sda
    /run/autofs.fifo-net
    /run/rpcbind.sock

    然后使用file -f test.txt命令就能批量读取文件类型
    批量读取文件内容

    [root@centos7 data]# file -f file.txt 
    /root/anaconda-ks.cfg: ASCII text
    /root:                 directory
    /bin:                  symbolic link to `usr/bin'
    /dev/zero:             character special
    /dev/sda:              block special
    /run/autofs.fifo-net:  fifo (named pipe)
    /run/rpcbind.sock:     socket
    

    文件管理

    创建文件

    touch命令用于创建空文件,如果文件存在则会刷新时间,而不会清空文件内容。

    [root@centos7 data]# ll
    total 0
    [root@centos7 data]# touch file.txt
    [root@centos7 data]# ll
    total 0
    -rw-r--r--. 1 root root 0 Aug 29 17:39 file.txt
    
    [root@centos7 data]# touch file.txt 
    [root@centos7 data]# ll file.txt
    -rw-r--r--. 1 root root 0 Aug 29 17:47 file.txt
    
    

    在Linux系统中创建文件除了使用touch以外,Bash Shell中还可以使用重定向符号>>>来创建文件,其中>会清空文件现有内容,而>>会追加文件内容

    > 也可以用来清空文件内容

    [root@centos7 data]# > file1.txt
    [root@centos7 data]# ll
    total 0
    -rw-r--r--. 1 root root 0 Aug 29 17:39 file1.txt
    -rw-r--r--. 1 root root 0 Aug 29 17:39 file.txt
    [root@centos7 data]# nano file1.txt 
    [root@centos7 data]# cat file1.txt 
    this is test content
    
    

    再次使用> file1.txt时会清空文件内容

    [root@centos7 data]# > file1.txt
    [root@centos7 data]# cat file1.txt 
    [root@centos7 data]# 
    

    使用>>创建文件时不会清空文件现有内容,也不会刷新时间

    [root@centos7 data]# ll
    total 4
    -rw-r--r--. 1 root root 21 Aug 29 17:41 file1.txt
    -rw-r--r--. 1 root root  0 Aug 29 17:39 file.txt
    [root@centos7 data]# > file2.txt
    [root@centos7 data]# nano file2.txt
    [root@centos7 data]# >> file2.txt
    [root@centos7 data]# cat file2.txt
    this is test content
    
    

    以当前日期为文件名创建.log日志文件

    [root@centos7 data]# touch `date +%F.log`
    [root@centos7 data]# ll
    total 8
    -rw-r--r--. 1 root root  0 Aug 29 17:44 2020-08-29.log
    -rw-r--r--. 1 root root 21 Aug 29 17:41 file1.txt
    -rw-r--r--. 1 root root 21 Aug 29 17:43 file2.txt
    -rw-r--r--. 1 root root  0 Aug 29 17:39 file.txt
    

    以昨天的日期为为文件名创建.log的日志文件

    [root@centos7 data]# touch `date -d '-1 day' +%F`.log
    [root@centos7 data]# ll
    total 8
    -rw-r--r--. 1 root root  0 Aug 29 17:44 2020-08-28.log
    -rw-r--r--. 1 root root  0 Aug 29 17:44 2020-08-29.log
    -rw-r--r--. 1 root root 21 Aug 29 17:41 file1.txt
    -rw-r--r--. 1 root root 21 Aug 29 17:43 file2.txt
    -rw-r--r--. 1 root root  0 Aug 29 17:39 file.txt
    
    

    复制文件和目录

    cp命令是copy的简写,该命令用于将一个或者多个文件或者文件夹复制到指定的目录中。

    • 如果复制一个文件,那么目标是文件或者目录
    • 如果复制多个文件,那么目标必须是目录

    默认root用户使用的cp命令是别名,即默认是cp -i

    [root@centos8 ~]# type cp
    cp is aliased to `cp -i'
    

    而cp命令除了是别名以外也是外部命令,位于/usr/bin/cp路径下

    [root@centos8 ~]# type cp
    cp is aliased to `cp -i'
    [root@centos8 ~]# which cp
    alias cp='cp -i'
    	/usr/bin/cp
    

    使用cp --help可以查看cp命令的使用方式

    [root@centos8 ~]# cp --help
    Usage: cp [OPTION]... [-T] SOURCE DEST
      or:  cp [OPTION]... SOURCE... DIRECTORY
      or:  cp [OPTION]... -t DIRECTORY SOURCE...
    

    将/etc/fstab文件复制到/data目录下并命名为fstab.bak,然后对比文件差异,发现文件复制后文件的时间发生了变化。

    ll !* 表示把上一个命令的参数 传递给ll命令执行

    [root@centos7 data]# ll /etc/fstab 
    -rw-r--r--. 1 root root 595 Aug 25 14:08 /etc/fstab
    [root@centos7 data]# cp /etc/fstab  /data/fstab.bak
    [root@centos7 data]# ll !*
    ll /etc/fstab /data/fstab.bak
    -rw-r--r--. 1 root root 595 Aug 29 17:55 /data/fstab.bak
    -rw-r--r--. 1 root root 595 Aug 25 14:08 /etc/fstab
    
    

    将普通用户guanglei的.bashrc文件复制到/data目录下并命名为.bash.bak,然后查看文件详细信息,发现文件复制后文件的所主和所组都发生了变化。

    [root@centos7 data]# cp ~guanglei/.bashrc /data/.bashrc.bak
    [root@centos7 data]# ll !*
    ll ~guanglei/.bashrc /data/.bashrc.bak
    -rw-r--r--. 1 root     root     231 Aug 29 17:58 /data/.bashrc.bak
    -rw-r--r--. 1 guanglei guanglei 231 Apr  1 10:17 /home/guanglei/.bashrc
    
    

    cp命令复制时默认通常只用于复制普通文件,使用ll 查看文件时,输出的详细信息的第一个字符如果是- 表示该文件是普通文件

    [root@centos8 ~]# ll /etc/fstab 
    -rw-r--r--. 1 root root 709 Jul 26 12:47 /etc/fstab
    

    Linux系统中除了普通文件以外,还有其他的文件类型,例如套接字文件,软链接文件等等。

    /etc目录下的grub2.cfg就是一个软链接文件

    [root@centos7 data]# ll /etc/grub2.cfg 
    lrwxrwxrwx. 1 root root 22 Aug 25 14:11 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
    

    将/etc目录下的grub2.cfg文件复制到/data目录下并重命名为grub2.cfg.bak后,其文件大小都不一致

    
    [root@centos7 data]# ll /etc/grub2.cfg 
    lrwxrwxrwx. 1 root root 22 Aug 25 14:11 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
    [root@centos7 data]# cp /etc/grub2.cfg  /data/grub2.cfg.bak
    [root@centos7 data]# ll !*
    ll /etc/grub2.cfg /data/grub2.cfg.bak
    -rw-r--r--. 1 root root 4247 Aug 29 18:00 /data/grub2.cfg.bak
    lrwxrwxrwx. 1 root root   22 Aug 25 14:11 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
    
    

    复制文件时如果不改名,那么目标就是目录

    将/etc目录下的fstab文件复制到/data目录下

    [root@centos7 data]# cp /etc/fstab  /data
    [root@centos7 data]# ll /data
    total 16
    -rw-r--r--. 1 root root  595 Aug 29 18:01 fstab
    -rw-r--r--. 1 root root  595 Aug 29 17:55 fstab.bak
    -rw-r--r--. 1 root root 4247 Aug 29 18:00 grub2.cfg.bak
    
    

    复制多个文件时,目标必须是目录,如果目标是文件,此时会提示目标不是一个目录

    将/etc目录下的fstab和issue文件复制到/data目录下

    [root@centos7 data]# cp /etc/fstab  /etc/issue /data
    cp: overwrite ‘/data/fstab’? y
    [root@centos7 data]# ll /data
    total 20
    -rw-r--r--. 1 root root  595 Aug 29 18:01 fstab
    -rw-r--r--. 1 root root  595 Aug 29 17:55 fstab.bak
    -rw-r--r--. 1 root root 4247 Aug 29 18:00 grub2.cfg.bak
    -rw-r--r--. 1 root root   23 Aug 29 18:01 issue
    
    

    cp命令复制文件夹时需要使用-r选项递归复制

    [root@centos7 data]# cp  -r /etc/sysconfig/  /data/sysconfig_bak
    [root@centos7 data]# ll /data
    total 24
    -rw-r--r--. 1 root root  595 Aug 29 18:01 fstab
    -rw-r--r--. 1 root root  595 Aug 29 17:55 fstab.bak
    -rw-r--r--. 1 root root 4247 Aug 29 18:00 grub2.cfg.bak
    -rw-r--r--. 1 root root   23 Aug 29 18:01 issue
    drwxr-xr-x. 6 root root 4096 Aug 29 18:02 sysconfig_bak
    
    

    如果再次执行cp -r /etc/sysconfig/ /data/sysconfigbak,cp命令会将/etc目录下的sysconfig复制到/data/sysconfigbak目录下,不具备幂等性,所谓的幂等性就是多次操作是同样的结果。

    cp命令常用的选项

    • -i 复制文件到已经存在的目录时提示是否覆盖
    • -r 递归复制目录以及内部的所有内容
    • -d --no-dereference --preserv=links 不复制原文件,只复制链接名
    • --preserv[=ARRT_LIST]
      • mode:权限
      • ownership:属主属组
      • timestamp:时间
      • links:链接
      • xattr
      • context
      • all
    • -a 归档 相当于-dR --preserv=all,常常用于备份
    • -v 看到拷贝的过程
    • -f force 删除后新建文件
    • -u 只复制源比目标更新的文件或者目标不存在的文件
    • -b 目标存在,覆盖前先备份,形式为filename
    • --backup=numbered 目标存在,覆盖前先备份加数字后缀

    cp命令在执行复制文件夹时,如果多次复制会提示是否覆盖

    [root@centos8 data]# cp -r /etc/sysconfig/ /data/
    [root@centos8 data]# cp -r /etc/sysconfig/ /data/
    cp: overwrite '/data/sysconfig/nftables.conf'? y
    cp: overwrite '/data/sysconfig/ebtables-config'? y
    cp: overwrite '/data/sysconfig/ip6tables-config'? 
    

    如果想要去掉提示,可以使用原始的cp命令,即在cp前面加上即可。

    [root@centos8 data]# cp -r /etc/sysconfig/ /data/
    

    cp命令在复制链接文件时默认复制的不是链接文件本身,而是链接文件指向的真实文件

    将/etc/grub2.cfg复制到/data/grub2.cfg_bak 目录下,此时data/grub2.cfg_bak 文件大小和/boot/grub2/grub.cfg文件大小一致,都是4274字节

    [root@centos7 data]# cp /etc/grub2.cfg  /data/grub2.cfg_bak
    [root@centos7 data]# ll 
    total 8
    lrwxrwxrwx. 1 root root   22 Aug 29 18:13 grub2.cfg -> ../boot/grub2/grub.cfg
    -rw-r--r--. 1 root root 4247 Aug 29 18:16 grub2.cfg_bak
    
    [root@centos7 data]# ll /boot/grub2/grub.cfg   /data/grub2.cfg_bak 
    -rw-r--r--. 1 root root 4247 Aug 25 14:17 /boot/grub2/grub.cfg
    -rw-r--r--. 1 root root 4247 Aug 29 18:16 /data/grub2.cfg_bak
    

    如果只想要复制链接本身,而不是链接指向的文件,可以使用cp -d,此时不会复制原文件,只会复制链接名。
    当复制链接名时文件大小一致。

    [root@centos7 data]# cp -d /etc/grub2.cfg  /data
    [root@centos7 data]# ll /etc/grub2.cfg  /data/grub2.cfg 
    lrwxrwxrwx. 1 root root 22 Aug 29 18:13 /data/grub2.cfg -> ../boot/grub2/grub.cfg
    lrwxrwxrwx. 1 root root 22 Aug 25 14:11 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
    

    cp命令默认在复制文件时没办法保存文件的元数据(例如文件的修改时间)

     [root@centos8 data]# cp /etc/fstab /data
    [root@centos7 data]# ll /etc/fstab  /data/fstab 
    -rw-r--r--. 1 root root 595 Aug 29 18:20 /data/fstab
    -rw-r--r--. 1 root root 595 Aug 25 14:08 /etc/fstab
    
    

    可以使用cp --preserv 选项保存相关的元数据

    --preserv

    [root@centos7 data]# cp --preserv=timestamp  /etc/fstab  /data
    cp: overwrite ‘/data/fstab’? y
    [root@centos7 data]# ll /etc/fstab  /data/fstab 
    -rw-r--r--. 1 root root 595 Aug 25 14:08 /data/fstab
    -rw-r--r--. 1 root root 595 Aug 25 14:08 /etc/fstab
    
    

    使用stat命令查看fstab文件的属性信息,对比下/etc/fstab和/data/fstab文件的元数据一致。

    [root@centos7 data]# stat /etc/fstab
      File: ‘/etc/fstab’
      Size: 595       	Blocks: 8          IO Block: 4096   regular file
    Device: 802h/2050d	Inode: 134320194   Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: system_u:object_r:etc_t:s0
    Access: 2020-08-28 21:00:45.434999469 +0800
    Modify: 2020-08-25 14:08:19.847241317 +0800
    Change: 2020-08-25 14:17:57.911636846 +0800
     Birth: -
    [root@centos7 data]# stat /data/fstab
      File: ‘/data/fstab’
      Size: 595       	Blocks: 8          IO Block: 4096   regular file
    Device: 803h/2051d	Inode: 70          Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: unconfined_u:object_r:etc_runtime_t:s0
    Access: 2020-08-28 21:00:45.434999469 +0800
    Modify: 2020-08-25 14:08:19.847241317 +0800
    Change: 2020-08-29 18:21:25.430487561 +0800
     Birth: -
    

    使用cp -a实现备份/etc文件夹

    将/etc目录备份到/data/etc_back目录下

    [root@centos8 data]# cp -a /etc/ /data/etc_bak
    
    

    使用cp -a备份指定的文件

    [root@centos7 data]# cp -a /etc/grub2.cfg  /data/grub2.cfg.bak
    
    

    在复制文件时,首先备份目标文件,可以使用cp -b实现,不过该选项不会保留每一个版本

    [root@centos7 data]# rm -rf *
    [root@centos7 data]# ll
    total 0
    
    [root@centos7 data]# cp /etc/fstab /data/
    [root@centos7 data]# cp -b /etc/fstab /data
    cp: overwrite ‘/data/fstab’? y
    [root@centos7 data]# ll
    total 8
    -rw-r--r--. 1 root root 595 Aug 29 18:26 fstab
    -rw-r--r--. 1 root root 595 Aug 29 18:26 fstab~
    
    

    cp --backup=numberd 选项可以实现 如果目标存在,覆盖前先备份加数字后缀

    [root@centos7 data]# rm -rf *
    [root@centos7 data]# cp --backup=numbered /etc/issue f1
    [root@centos7 data]# cp --backup=numbered /etc/motd f1
    cp: overwrite ‘f1’? y
    [root@centos7 data]# ll
    total 4
    -rw-r--r--. 1 root root  0 Aug 30 08:04 f1
    -rw-r--r--. 1 root root 23 Aug 30 08:04 f1.~1~
    

    使用cp命令实现将/etc目录下的所有文件备份到/data独立的子目录下,并且要求子目录格式为backupYYYY-mm-dd,备份过程可见

    [root@centos7 data]# cp -av /etc/ /data/backup`date +%F`
    [root@centos7 data]# ll
    total 12
    drwxr-xr-x. 140 root root 8192 Aug 30 07:16 backup2020-08-30

    使用cp命令实现复制/root目录到/data/rootdir目录下,要求保留权限

    [root@centos8 data]# cp -r --preserv=mode /root /data/rootdir
     

    使用cp命令实现复制隐藏文件和非隐藏文件

    [root@centos7 data]# touch a.txt b.txt &cp ~/.bashrc .
    [1] 4345
    [1]+  Done                    touch a.txt b.txt
    
    [root@centos7 data]# ls -a
    .  ..  a.txt  .bashrc  b.txt
    [root@centos7 data]# cp -av . /opt/
    ‘./a.txt’ -> ‘/opt/./a.txt’
    ‘./b.txt’ -> ‘/opt/./b.txt’
    ‘./.bashrc’ -> ‘/opt/./.bashrc’
    [root@centos7 data]# ls /opt/
    a.txt  b.txt  rh

    移动文件和重命名

    mv命令可以实现文件的移动或者是重命名,默认的mv命令是别名,即如果存在则会提示是否覆盖。

    [root@centos7 data]# type mv
    mv is aliased to `mv -i'

    常用的选项:

    • -i 交互式
    • -f 强制
    • -b 覆盖前先备份

    mv实现移动文件

    [root@centos7 data]# rm -rf *
    [root@centos7 data]# mv /etc/motd  .
    [root@centos7 data]# ll
    total 0
    -rw-r--r--. 1 root root 0 Jun  7  2013 motd
    

    mv实现移动目录

    首先在/data目录下创建目录parent/child
    然后在child目录下创建文件test.txt
    最后将parent 目录移动到/opt目录下

    [root@centos7 data]# mkdir -p parent/child
    [root@centos7 data]# cd parent/child/
    [root@centos7 child]# touch test.txt
    [root@centos7 child]# cd ..
    
    [root@centos7 parent]# cd .. 
    [root@centos7 data]# mv parent/  /opt/
    [root@centos7 data]# ll /opt/
    total 0
    drwxr-xr-x. 3 root root 19 Aug 30 08:15 parent
    drwxr-xr-x. 2 root root  6 Oct 31  2018 rh
    

    将/opt/parent移动到/data目录下

    [root@centos7 data]# mv /opt/parent/  /data/
    [root@centos7 data]# ll
    total 0
    -rw-r--r--. 1 root root  0 Jun  7  2013 motd
    drwxr-xr-x. 3 root root 19 Aug 30 08:15 parent
    

    由于删除操作具有一定的危险性,在线上运维环境中通常使用mv代替rm命令。

    mv命令实现重命名

    [root@centos8 rootdir]# ll
    total 8
    -rw------- 1 root root 1602 Aug  9 10:51 anaconda-ks.cfg
    -rw-r--r-- 1 root root 1712 Aug  9 10:51 initial-setup-ks.cfg
    [root@centos8 rootdir]# mv anaconda-ks.cfg  anaconda-ks.cfg.bak
    [root@centos8 rootdir]# ll
    total 8
    -rw------- 1 root root 1602 Aug  9 10:51 anaconda-ks.cfg.bak
    -rw-r--r-- 1 root root 1712 Aug  9 10:51 initial-setup-ks.cfg
    

    mv命令只能实现单个文件重命名,如果想要实现多个文件重命名时,可以使用rename命令实现

    使用rename实现将.log后缀的文件全部重命名为.log.bak

    [root@centos7 data]# rm -rf *
    [root@centos7 data]# touch f{1..10}.log
    [root@centos7 data]# ls
    f10.log  f1.log  f2.log  f3.log  f4.log  f5.log  f6.log  f7.log  f8.log  f9.log
    [root@centos7 data]# rename .log .log.bak *
    [root@centos7 data]# ls
    f10.log.bak  f2.log.bak  f4.log.bak  f6.log.bak  f8.log.bak
    f1.log.bak   f3.log.bak  f5.log.bak  f7.log.bak  f9.log.bak
    

    删除文件

    在windows系统中删除文件,系统会将删除的文件放到回收站中。
    而linux系统的删除使用rm命令,但是是没有回收站。因此在删除文件时需要小心操作,以免造成严重的后果。

    rm命令常用的选项

    • -i 交互式删除
    • -f 强制删除
    • -r 递归删除
    • --no-preserve-root 删根目录

    默认的rm命令是别名,在删除文件时系统会提示是否确认删除

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

    rm是一个外部命令,默认使用的是别名

    [root@centos8 rootdir]# which rm
    alias rm='rm -i'
    	/usr/bin/rm

    删除/data目录下的f1.log.bak文件,按y键确认删除

    [root@centos7 data]# ls
    f10.log.bak  f2.log.bak  f4.log.bak  f6.log.bak  f8.log.bak
    f1.log.bak   f3.log.bak  f5.log.bak  f7.log.bak  f9.log.bak
    [root@centos7 data]# rm f1.log.bak 
    rm: remove regular empty file ‘f1.log.bak’? y
    [root@centos7 data]# ls
    f10.log.bak  f2.log.bak  f3.log.bak  f4.log.bak  f5.log.bak  f6.log.bak  f7.log.bak  f8.log.bak  f9.log.bak
    

    想要一次性删除多个文件而不要系统提示是否确认删除,可以使用rm的命令,而不是别名

    删除的文件不存在,系统会提示cannot remove 'xxx': No such file or directory

    [root@centos7 data]# 
    m f2.log.bak  f3.log.bak f4.log.bak 
    [root@centos7 data]# ls
    f10.log.bak  f5.log.bak  f6.log.bak  f7.log.bak  f8.log.bak  f9.log.bak
    
    

    rm 命令除了删除文件外,还可以删除文件夹,不过需要使使用-r选项

    [root@centos7 data]# mkdir log
    [root@centos7 data]# mv f*.bak log
    [root@centos7 data]# ls log
    f10.log.bak  f5.log.bak  f6.log.bak  f7.log.bak  f8.log.bak  f9.log.bak
    [root@centos7 data]# 
    m -r log
    

    rm命令还可以自杀,使用rm -rf /可以删除系统

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

    幸运的是自从CentOS6以后该命令需要加--no-preserve-root 长选项才可以删除系统,因为删除系统是自杀式行为

    如果你的系统没有在VMware WorkStation中做快照,切勿执行该命令。

    [root@centos8 data]# rm -rf --no-preserve-root /

    在删除的过程中有些文件是无法删除的,例如/proc的目录是无法删除,内部命令是无法删除,因为内部命令随着shell启动已经加载到内存,rm删除的是磁盘的文件。

    如果执行了该命令,需要使用VM WareWorkStation来恢复系统到初始化默认的安装状态
    恢复快照

    rm -rf * 无法删除隐藏文件,删除隐藏文件可以使用rm .[^.]*删除所有隐藏文件

    [root@centos7 data]# touch a.txt b.txt &cp ~/.bashrc .
    [1] 4201
    [1]+  Done                    touch a.txt b.txt
    [root@centos7 data]# ls -a
    .  ..  a.txt  .bashrc  b.txt
    [root@centos7 data]# rm -rf *
    [root@centos7 data]# ls -a
    .  ..  .bashrc
    [root@centos7 data]# rm .[^.]*
    rm: remove regular file ‘.bashrc’? y
    [root@centos7 data]# ls -a
    .  ..
    

    使用rm命令删除隐藏文件和非隐藏文件,可以使用rm -rf * .[^.]* 命令删除

    [root@centos7 data]# touch a.txt b.txt &cp ~/.bashrc .
    [1] 4485
    [1]+  Done                    touch a.txt b.txt
    
    [root@centos7 data]# ls -a
    .  ..  a.txt  .bashrc  b.txt
    [root@centos7 data]# rm -rf * .[^.]*
    [root@centos7 data]# ls -a
    .  ..
    

    在线上环境禁止使用rm命令,使用mv命令代替rm命令,因为rm命令可以自杀,造成严重的经济损失

    rm在删除文件时,如果文件被占用了,此时不会立即释放磁盘空间,除非被占用的文件被释放才会释放空间,我们可以使用重定向> 来清除文件内容,清除后在使用rm命令删除文件此时会立即释放磁盘空间。

    首先使用cp命令将/dev/zero文件复制到/boot目录下,使用df命令查看/boot磁盘空间的使用率

    [root@centos8 data]# cp /dev/zero  /boot/
    ^C
    [root@centos8 data]# df -h /boot
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1       2.0G  1.4G  456M  76% /boot
    

    然后复制10.0.0.100的会话,并使用vim打开/boot/zero文件
    文件被占用

    在原会话10.0.0.100中删除/boot/zero文件,并使用df命令查看磁盘空间并没有发生改变

    [root@centos8 data]# rm -rf /boot/zero
    [root@centos8 data]# df -h /boot
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1       2.0G  1.4G  456M  76% /boot
    

    只有把复制的会话关闭以后才会释放磁盘空间
    复制会话

    [root@centos8 data]# df -h /boot
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1       2.0G  192M  1.7G  11% /boot
    

    复制会话关闭后查看磁盘空间
    复制会话关闭后查看磁盘空间

    如果想要删除后立即释放磁盘空间,可以首先使用>清除文件内容,然后再使用rm命令删除,此时即使删除的文件被占用也可以立即释放磁盘空间

    [root@centos8 boot]# cp /dev/zero /boot
    ^C
    [root@centos8 boot]# df -h /boot
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1       2.0G  904M  930M  50% /boot
    
    [root@centos8 boot]# > zero 
    [root@centos8 boot]# rm -rf zero 
    
    [root@centos8 boot]# df -h /boot
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1       2.0G  192M  1.7G  11% /boot
    

    在删除文件时可能会遇到一些无法正常删除的文件,例如这里的-f文件

    [root@centos7 data]# touch ./-f
    [root@centos7 data]# ls 
    -f

    此时我们删除文件时可以使用路径加文件名的格式删除文件

    [root@centos7 data]# rm -rf /data/-f
    [root@centos7 data]# ll
    total 0
    
  • 相关阅读:
    CRM小结 – Account Management 1
    懂ABAP的好处
    Enhancement in Sales order 销售订单中的增强
    Account Classification
    关于Business Data Toolset
    Account Life Cycle Stage - 客户的生命周期管理
    使用维护Relationship
    Tansaction Variant and Screen Variant
    关于软件测试的认识与学习目标
    《ASP.NET MVC Music Store Tutorial》在Visual Studio 2008简体中文环境下的代码修订
  • 原文地址:https://www.cnblogs.com/ittimeline/p/13877936.html
Copyright © 2011-2022 走看看