高級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+found9 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+found4 directories
創建目錄

mkdir用於創建目錄,默認只能創建一級目錄

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

如果想要一次性創建多級目錄,可以使用mkdir -p實現,因為mkdir不支持一次創建多級子目錄

[root@centos8 data]# mkdir a/b/cmkdir: cannot create directory ‘a/b/c’: No such file or directory[root@centos8 data]# mkdir -p  a/b/c[root@centos8 data]# lltotal 0drwxr-xr-x. 3 root root 15 Aug  9 11:39 adrwxr-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 testdirtestdir└── dir1    ├── x    │   ├── a    │   └── b    └── y        ├── a        └── b7 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-ens33ifcfg-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]# lltotal 0drwxr-xr-x. 2 root root 6 Aug 29 11:27 test[root@centos7 data]# rmdir test/[root@centos7 data]# lltotal 0
列出目錄

在訪問Linux文件系統時通常需要查看文件的相關信息,Linux提供了ls命令以及相關的選項來查看文件或者目錄的相關信息,ls命令默認使用的是別名

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

在查看文件信息時會給文件增加顏色,如果想使用原命令,可以在ls命令左邊加上\即可

高級Linux運維工程師養成記-Linux文件管理命令實戰

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.   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目錄的文件屬性

[root@centos7 ~]# ls -l /boottotal 123444-rw-r--r--. 1 root root   153562 Apr  1 07:40 config-3.10.0-1127.el7.x86_64drwx------. 3 root root       17 Nov  9  2018 efidrwxr-xr-x. 2 root root       27 Aug 25 14:10 grubdrwx------. 5 root root       97 Aug 25 14:17 grub2-rw-------. 1 root root 79475750 Aug 25 14:15 initramfs-0-rescue-0565e5a759964e90a38249dae50bcc33.img-rw-------. 1 root root 29299461 Aug 25 14:17 initramfs-3.10.0-1127.el7.x86_64.img-rw-r--r--. 1 root root   320512 Apr  1 07:40 symvers-3.10.0-1127.el7.x86_64.gz-rw-------. 1 root root  3611662 Apr  1 07:40 System.map-3.10.0-1127.el7.x86_64-rwxr-xr-x. 1 root root  6762688 Aug 25 14:15 vmlinuz-0-rescue-0565e5a759964e90a38249dae50bcc33-rwxr-xr-x. 1 root root  6762688 Apr  1 07:40 vmlinuz-3.10.0-1127.el7.x86_64

查看/boot目錄的屬性

ls -l讀取的時間是mtime

[root@centos7 ~]# ls -ld /bootdr-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\03.

由於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 fileDevice: 803h/2051dInode: 67          Links: 1Access: (0644/-rw-r--r--)  Uid: ( 1000/guanglei)   Gid: (    0/    root)Context: unconfined_u:object_r:etc_runtime_t:s0Access: 2020-08-29 12:18:22.951420707 +0800Modify: 2020-08-29 12:34:54.298378239 +0800Change: 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/fileELF 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編輯器編輯如下內容

高級Linux運維工程師養成記-Linux文件管理命令實戰

編輯文件時不要有空格或者是換行,否則使用file命令讀取文件內容會讀取失敗!!!

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

然後使用file -f test.txt命令就能批量讀取文件類型

高級Linux運維工程師養成記-Linux文件管理命令實戰
[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]# lltotal 0[root@centos7 data]# touch file.txt[root@centos7 data]# lltotal 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]# lltotal 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]# lltotal 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.txtthis is test content

以當前日期為文件名創建.log日誌文件

[root@centos7 data]# touch `date +%F.log`[root@centos7 data]# lltotal 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]# lltotal 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 cpcp is aliased to `cp -i'

而cp命令除了是別名以外也是外部命令,位於/usr/bin/cp路徑下

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

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

[root@centos8 ~]# cp --helpUsage: 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.baklrwxrwxrwx. 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 /datatotal 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 /datacp: overwrite ‘/data/fstab’? y[root@centos7 data]# ll /datatotal 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 /datatotal 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 issuedrwxr-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:鏈接xattrcontextall
  • -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'? ycp: overwrite '/data/sysconfig/ebtables-config'? ycp: 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 8lrwxrwxrwx. 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.cfglrwxrwxrwx. 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  /datacp: 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 fileDevice: 802h/2050dInode: 134320194   Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Context: system_u:object_r:etc_t:s0Access: 2020-08-28 21:00:45.434999469 +0800Modify: 2020-08-25 14:08:19.847241317 +0800Change: 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 fileDevice: 803h/2051dInode: 70          Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Context: unconfined_u:object_r:etc_runtime_t:s0Access: 2020-08-28 21:00:45.434999469 +0800Modify: 2020-08-25 14:08:19.847241317 +0800Change: 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]# lltotal 0[root@centos7 data]# cp /etc/fstab /data/[root@centos7 data]# cp -b /etc/fstab /datacp: overwrite ‘/data/fstab’? y[root@centos7 data]# lltotal 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 f1cp: overwrite ‘f1’? y[root@centos7 data]# lltotal 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]# lltotal 12drwxr-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 mvmv is aliased to `mv -i'

常用的選項:

  • -i 交互式
  • -f 強制
  • -b 覆蓋前先備份

mv實現移動文件

[root@centos7 data]# rm -rf *[root@centos7 data]# mv /etc/motd  .[root@centos7 data]# lltotal 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 0drwxr-xr-x. 3 root root 19 Aug 30 08:15 parentdrwxr-xr-x. 2 root root  6 Oct 31  2018 rh

將/opt/parent移動到/data目錄下

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

由於刪除操作具有一定的危險性,在線上運維環境中通常使用mv代替rm命令。

mv命令實現重命名

[root@centos8 rootdir]# lltotal 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]# lltotal 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]# lsf10.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]# lsf10.log.bak  f2.log.bak  f4.log.bak  f6.log.bak  f8.log.bakf1.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 rmrm is aliased to `rm -i'

rm是一個外部命令,默認使用的是別名

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

刪除/data目錄下的f1.log.bak文件,按y鍵確認刪除

[root@centos7 data]# lsf10.log.bak  f2.log.bak  f4.log.bak  f6.log.bak  f8.log.bakf1.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]# lsf10.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]# \rm f2.log.bak  f3.log.bak f4.log.bak [root@centos7 data]# lsf10.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 logf10.log.bak  f5.log.bak  f6.log.bak  f7.log.bak  f8.log.bak  f9.log.bak[root@centos7 data]# \rm -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來恢復系統到初始化默認的安裝狀態

高級Linux運維工程師養成記-Linux文件管理命令實戰

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 /bootFilesystem      Size  Used Avail Use% Mounted on/dev/sda1       2.0G  1.4G  456M  76% /boot

然後複製10.0.0.100的會話,並使用vim打開/boot/zero文件

高級Linux運維工程師養成記-Linux文件管理命令實戰

在原會話10.0.0.100中刪除/boot/zero文件,並使用df命令查看磁盤空間並沒有發生改變

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

只有把複製的會話關閉以後才會釋放磁盤空間

高級Linux運維工程師養成記-Linux文件管理命令實戰
[root@centos8 data]# df -h /bootFilesystem      Size  Used Avail Use% Mounted on/dev/sda1       2.0G  192M  1.7G  11% /boot
高級Linux運維工程師養成記-Linux文件管理命令實戰

複製會話關閉後查看磁盤空間

如果想要刪除後立即釋放磁盤空間,可以首先使用>清除文件內容,然後再使用rm命令刪除,此時即使刪除的文件被佔用也可以立即釋放磁盤空間

[root@centos8 boot]# cp /dev/zero /boot^C[root@centos8 boot]# df -h /bootFilesystem      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 /bootFilesystem      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]# lltotal 0

版權聲明:本文源自 網絡, 於,由 楠木軒 整理發佈,共 22889 字。

轉載請註明: 高級Linux運維工程師養成記-Linux文件管理命令實戰 - 楠木軒