1. 程式人生 > 實用技巧 >跟光磊學Linux運維-Linux檔案管理命令實戰

跟光磊學Linux運維-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 -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
\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 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命令讀取檔案內容會讀取失敗!!!

/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]# \rm 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]# \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來恢復系統到初始化預設的安裝狀態

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