高級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命令左邊加上\即可
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編輯器編輯如下內容
編輯文件時不要有空格或者是換行,否則使用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]# 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來恢復系統到初始化默認的安裝狀態
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文件
在原會話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
只有把複製的會話關閉以後才會釋放磁盤空間
[root@centos8 data]# df -h /bootFilesystem 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 /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