1. 程式人生 > 實用技巧 >linux檔案管理和IO重定向

linux檔案管理和IO重定向

linux檔案管理和IO重定向

1、檔案系統目錄結構

1.1、檔案系統的目錄結構

​ 檔案系統從根目錄下開始,用 / 表示

​ 以 . 開頭的檔案為隱藏檔案

​ 路徑分隔的 /

​ 檔名最長255個位元組

​ 路徑在內檔名稱最長4095個位元組

​ 藍色-->目錄 綠色-->可執行檔案 紅色-->壓縮檔案 淺藍色-->連結檔案 灰色-->其他檔案

​ 除了斜槓和NULL,所有的字元都有效,但使用特殊字元的目錄名和檔案不推薦使用,有些字元需要用引號來引用

​ 每個檔案都有兩類相關資料;元資料:metadata,即屬性,資料:data,檔案內容

1.2、常見的檔案系統目錄結構

/boot:引導檔案存放目錄,核心檔案(vmlinuz)、引導載入器(bootloader, grub)都存放於此目錄
/bin:所有使用者使用的基本命令;不能關聯至獨立分割槽,OS啟動即會用到的程式
/sbin:管理類的基本命令;不能關聯至獨立分割槽,OS啟動即會用到的程式
/lib:啟動時程式依賴的基本共享庫檔案以及核心模組檔案(/lib/modules)
/lib64:專用於x86_64系統上的輔助共享庫檔案存放位置
/etc:配置檔案目錄
/home/USERNAME:普通使用者家目錄
/root:管理員的家目錄
/media:行動式移動裝置掛載點
/mnt:臨時檔案系統掛載點
/dev:裝置檔案及特殊檔案儲存位置
	b: block device,隨機訪問
	c: character device,線性訪問
/opt:第三方應用程式的安裝位置
/srv:系統上執行的服務用到的資料
/tmp:臨時檔案儲存位置
/usr: universal shared, read-only data
	bin: 保證系統擁有完整功能而提供的應用程式
	sbin:
	lib:32位使用
	lib64:只存在64位系統
	include: C程式的標頭檔案(header files)
	share:結構化獨立的資料,例如doc, man等
		local:第三方應用程式的安裝位置
			bin, sbin, lib, lib64, etc, share
/var: variable data files
	cache: 應用程式快取資料目錄
	lib: 應用程式狀態資訊資料
	local:專用於為/usr/local下的應用程式儲存可變資料
	lock: 鎖檔案
	log: 日誌目錄及檔案
	opt: 專用於為/opt下的應用程式儲存可變資料
	run: 執行中的程序相關資料,通常用於儲存程序pid檔案
	spool: 應用程式資料池
	tmp: 儲存系統兩次重啟之間產生的臨時資料
/proc: 用於輸出核心與程序資訊相關的虛擬檔案系統
/sys:用於輸出當前系統上硬體裝置相關資訊虛擬檔案系統
/selinux: security enhanced Linux,selinux相關的安全策略等資訊的儲存位置

1.3、應用程式的組成部分

二進位制程式:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin

庫檔案:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64

配置檔案:/etc, /etc/DIRECTORY, /usr/local/etc

幫助檔案:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

1.4、Centos7以後版本目錄結構變化

​ /bin 和 /usr/bin

​ /sbin 和 /usr/sbin

​ /lib 和/usr/lib

​ /lib64 和 /usr/lib64

範例:

[root@centos8 ~]# ls /bin /sbin /lib /lib64 -ld
lrwxrwxrwx. 1 root root 7 May 11  2019 /bin -> usr/bin
lrwxrwxrwx. 1 root root 7 May 11  2019 /lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11  2019 /lib64 -> usr/lib64
lrwxrwxrwx. 1 root root 8 May 11  2019 /sbin -> usr/sbin

[root@centos6 ~]# ls /bin /sbin /lib /lib64 -ld
dr-xr-xr-x.  2 root root  4096 Dec  2 03:38 /bin
dr-xr-xr-x. 11 root root  4096 Dec  1 22:19 /lib
dr-xr-xr-x.  9 root root 12288 Dec  2 03:38 /lib64
dr-xr-xr-x.  2 root root 12288 Dec  2 03:38 /sbin

root@NAME:~# ll /bin /usr/bin -d
drwxr-xr-x 2 root root  4096 Dec  1 14:37 /bin/
drwxr-xr-x 2 root root 20480 Dec  1 14:38 /usr/bin/

1.5、Linux下的檔案型別


- – 普通檔案

- d 目錄檔案directory

- b 塊裝置block

- c 字元裝置character

- l 符號連結檔案link

- p 管道檔案pipe

- s 套接字檔案socket


範例:
	
	[root@zhang ~]# ls -l /run/
	total 56
	drwxr-xr-x.  2 root           root            100 Dec  5 09:35 abrt
	-rw-------.  1 root           root             11 Dec  5 09:35 		alsactl.pid
	-rw-r--r--.  1 root           root              5 Dec  5 09:35 atd.pid
	-rw-r--r--.  1 root           root              4 Dec  5 09:35 auditd.pid
	drwxr-xr-x.  2 avahi          avahi            80 Dec  5 09:35 avahi-daemon
	drwxr-xr-x.  3 root           root             60 Dec  5 09:35 boltd
	drwxr-xr-x.  2 root           root             80 Dec  5 09:36 console
	-rw-r--r--.  1 root           root              5 Dec  5 09:35 crond.pid
	----------.  1 root           root              0 Dec  5 09:35 cron.reboot
	drwx------.  2 root           root             40 Dec  5 09:35 cryptsetup
	drwxr-xr-x.  3 root           lp               80 Dec  5 09:35 cups
	drwxr-xr-x.  2 root           root             60 Dec  5 09:35 dbus
	-rw-r--r--.  1 root           root              5 Dec  5 15:44 dhclient-ens33.pid
	prw-------.  1 root           root              0 Dec  5 09:34 dmeventd-client
	prw-------.  1 root           root              0 Dec  5 09:34 dmeventd-server
	-rw-------.  1 root           root              0 Dec  5 09:35 ebtables.lock
	drwxr-xr-x.  2 root           root             40 Dec  5 09:35 faillock
	drwxr-x---.  2 root           root             40 Dec  5 14:49 firewalld
	drwx--x--x.  4 root           gdm             100 Dec  5 09:36 gdm
	-rw-------.  1 root           root              4 Dec  5 09:35 gssproxy.pid
	srw-rw-rw-.  1 root           root              0 Dec  5 09:35 gssproxy.sock
	drwxr-xr-x.  4 root           root            100 Dec  5 09:34 initramfs
	-rw-r--r--.  1 root           root              4 Dec  5 09:35 ksmtune.pid
	drwxr-xr-x.  7 root           root            240 Dec  5 09:35 libvirt
	-rw-r--r--.  1 root           root              4 Dec  5 09:35 libvirtd.pid
	drwxr-xr-x.  8 root           root            200 Dec  5 10:32 lock
	drwxr-xr-x.  3 root           root             60 Dec  5 09:34 log
	drwxrwxr-x.  3 root           libstoragemgmt   60 Dec  5 09:35 lsm
	drwx------.  2 root           root             80 Dec  5 09:34 lvm
	-rw-r--r--.  1 root           root              4 Dec  5 09:34 lvmetad.pid
	srwxr-xr-x.  1 root           root              0 Dec  5 09:35 mcelog-client
	-rw-r--r--.  1 root           root              3 Dec  5 09:35 mcelog.pid
	drwx--x---.  2 root           root             40 Dec  5 09:35 mdadm
	drwxr-xr-x.  3 root           root             60 Dec  5 09:36 media
	drwxr-xr-x.  2 root           root             80 Dec  5 09:36 mount
	drwxrwxr-x.  2 root           root             40 Dec  5 09:35 netreport
	drwxr-xr-x.  4 root           root            140 Dec  5 14:49 NetworkManager
	drwxr-xr-x.  2 root           root             40 Dec  5 09:35 plymouth
	drwxr-xr-x.  2 root           root             40 Dec  5 09:35 ppp
	drwxr-xr-x.  2 radvd          radvd            40 Dec  5 09:35 radvd
	drwx------.  2 rpc            rpc              40 Dec  5 09:35 rpcbind
	-r--r--r--.  1 root           root              0 Dec  5 09:35 rpcbind.lock
	srw-rw-rw-.  1 root           root              0 Dec  5 09:35 rpcbind.sock
	drwxr-xr-x.  2 root           root             40 Dec  5 09:35 samba
	drwxrwxr-x.  2 root           screen           40 Dec  5 09:35 screen
	drwxr-xr-x.  2 root           root             40 Dec  5 09:35 sepermit
	drwxr-xr-x.  2 root           root             40 Dec  5 09:35 setrans
	drwx--x--x.  2 setroubleshoot setroubleshoot   40 Dec  5 09:35 setroubleshoot
	-rw-------.  1 root           root              5 Dec  5 09:35 sm-notify.pid
	drwxr-xr-x.  2 root           root             40 Dec  5 09:35 spice-vdagentd
	-rw-r--r--.  1 root           root              5 Dec  5 09:35 sshd.pid
	drwx--x--x.  3 root           root             60 Dec  5 09:35 sudo
	drwxr-xr-x.  2 root           root             60 Dec  5 09:35 sysconfig
	-rw-------.  1 root           root              4 Dec  5 09:35 syslogd.pid
	drwxr-xr-x. 18 root           root            440 Dec  5 09:35 systemd
	drwxr-xr-x.  2 root           root             60 Dec  5 09:34 tmpfiles.d
	drwxr-xr-x.  2 root           root             60 Dec  5 09:35 tuned
	drwxr-xr-x.  7 root           root            160 Dec  5 09:37 udev
	drwx------.  2 root           root             60 Dec  5 09:36 udisks2
	drwxr-xr-x.  4 root           root             80 Dec  5 14:16 user
	-rw-rw-r--.  1 root           utmp           1920 Dec  5 14:16 utmp
	drwxr-xr-x.  2 root           root             60 Dec  5 09:35 vmware
	-rw-------.  1 root           root              0 Dec  5 09:35 xtables.lock
	```
	
	

### **2、檔案操作命令**

#### 	2.1、顯示當前工作目錄

pwd命令;(printing  working  directory)

​	-P 顯示真實物理路徑

​	-L 顯示連結路徑(預設)

#### 	2.2、絕對和相對路徑

絕對路徑

以正斜槓/即根目錄開始

​	完整的檔案的位置路徑

​	可用於任何想指定一個檔名的時候

相對路徑

​	不以斜線開始

​		一般情況下,是指相對於當前工作目錄的路徑,特殊場景下,是相對於某目錄的位置可以作為一個簡短的形式指定一個檔名

基名:basename,只取檔名而不要路徑

目錄名:dirname,只取路徑,不要檔名

範例:

```bash
[root@zhang ~]# basename /etc/sysconfig/network
network
[root@zhang ~]# dirname /etc/sysconfig/network
/etc/sysconfig

2.3、更改目錄

cd命令:change directory 改變目錄

選項:-p 切換至物理路徑,而非軟連線目錄

切換至父目錄: cd..

切換至當前使用者目錄: cd

切換至以前的工作目錄:cd-

範例:

[root@zhang ~]# cd /etc/sysconfig
[root@zhang sysconfig]# pwd
/etc/sysconfig
[root@zhang sysconfig]# cd ../../data
[root@zhang data]# pwd
/data
[root@zhang data]# cd -P /bin
[root@zhang bin]# pwd
/usr/bin 

相關的環境變數:

​ PWD:當前目錄路徑

​ OLDPWD:上一次目錄路徑

範例:

[root@zhang bin]# echo $OLDPWD
/data
[root@zhang bin]# cd -
/data
[root@zhang data]# pwd
/data

2.4、列出目錄內容

ls命令可以列出當前目錄的內容或指定目錄

用法:

ls [option] [files_or_dirs]

常見選項:

​ -a 包含隱藏檔案

​ -l 顯示額外的資訊

​ -R 目錄遞迴

​ -ld 目錄和符號連結資訊

​ -l 檔案分行顯示

​ -S 按從大到小排序

​ -t 按mtime排序

​ -u 配合-t選項,顯示並按atime從新到舊排序

​ -U 按目錄存放順序顯示

​ -X 按檔案字尾排序

​ -F 對不同型別的檔案顯示時附加不同的符號:*/=>@|

​ -C 檔案多時,以多列的方式顯示檔案,預設時一列(標準輸出)

2.5、檢視檔案狀態stat

檔案相關資訊:metadata,data

每個檔案有三個時間戳:

access time 訪問時間,atime,讀取檔案內容

modify time 修改時間,mtine,改變檔案內容

change time 改變時間,ctime,元資料發生改變

範例:

[root@zhang data]# stat /etc/passwd
  File: ‘/etc/passwd’
  Size: 2262      	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 135675671   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:passwd_file_t:s0

Access: 2020-12-05 12:40:01.260936559 +0800
Modify: 2020-12-01 12:37:26.130624527 +0800
Change: 2020-12-01 12:37:26.130624527 +0800
 Birth: -

2.6、確定檔案內容

檔案可以包含多種型別的資料,使用file命令檢查檔案的型別,然後確定適當的開啟命令或應用程式使用

格式:

​ file [option] ...

常用選項:

​ -b 列出檔案辨識結果時,不顯示檔名稱

​ -f filelist列出檔案filelist中檔名的檔案型別

​ -F 使用指定分隔符號替換輸出檔名後預設的":"分隔符

​ -L 檢視對應軟連線對應檔案的檔案型別

​ --help 顯示命令線上幫助

範例:

[root@zhang data]# cat linux.txt
a
b
c
[root@zhang data]# cat win.txt
a
b
[root@zhang data]# file win.txt linux.txt
win.txt:   ASCII text
linux.txt: ASCII text
[root@zhang data]# hexdump -C linux.txt
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
[root@zhang data]# hexdump -C win.txt
00000000  61 0a 62 0a                                       |a.b.|
00000004

安裝轉換工具

2.7、檔案萬用字元模式wildcard patteern

檔案萬用字元可以用來匹配符合條件的多個檔案,方便批量管理檔案

通配符采用特定的符號,表示特定的含義,此特符號稱為元meta字元

常見的萬用字元如下:

\*       匹配零個或多個字元,但不匹配 "." 開頭的檔案,即隱藏檔案
?       匹配任何單個字元
~       當前使用者家目錄 ~mage   使用者mage家目錄 
~+和.    當前工作目錄 
~-      前一個工作目錄
[0-9]   匹配數字範圍 
[a-z]   字母
[A-Z]   字母
[wang]  匹配列表中的任何的一個字元
 	[^wang] 匹配列表中的所有字元以外的字元

另外還有在Linux系統中預定義的字元類:man 7 glob

[:digit:]:任意數字,相當於0-9
[:lower:]:任意小寫字母,表示 a-z
[:upper:]: 任意大寫字母,表示 A-Z 
[:alpha:]: 任意大小寫字母
[:alnum:]:任意數字或字母
[:blank:]:水平空白字元
[:space:]:水平或垂直空白字元
[:punct:]:標點符號
[:print:]:可列印字元 
[:cntrl:]:控制(非列印)字元 
[:graph:]:圖形字元 
[:xdigit:]:十六進位制字元

範例:

[root@centos8 wang]#echo $OLDPWD
/data
[root@centos8 wang]#ll -/linux.txt
ls: invalid option -- '/'
Try 'ls --help' for more information.
[root@centos8 wang]#ll ~-/linux.txt
-rw-r--r-- 1 root root 6 Mar 23 09:48 /data/linux.txt

範例:

[root@centos8 data]#touch file{a..z}.txt file{A..Z}.txt file{0.9}.txt
[root@centos8 data]#ll file{0..9}.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file0.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file1.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file2.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file3.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file4.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file5.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file6.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file7.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file8.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file9.txt
[root@centos8 data]#ll file[0-9].txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file0.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file1.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file2.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file3.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file4.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file5.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file6.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file7.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file8.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file9.txt

[root@centos8 data]#ls file[a-c].txt
filea.txt  fileA.txt  fileb.txt  fileB.txt  filec.txt
[root@centos8 data]#ls file[C-E].txt
fileC.txt  filed.txt  fileD.txt  filee.txt  fileE.txt

[root@centos8 data]#ls file[wang].txt
filea.txt  fileg.txt  filen.txt  filew.txt
[root@centos8 data]#ls file[^wang].txt

範例:

[root@centos8 data]#ls file[:lower:].txt
filee.txt  filel.txt  fileo.txt  filer.txt  filew.txt
[root@centos8 data]#ls file[[:lower:]].txt
filea.txt  filed.txt  fileg.txt  filej.txt  filem.txt  filep.txt  files.txt  filev.txt  filey.txt
fileb.txt  filee.txt  fileh.txt  filek.txt  filen.txt  fileq.txt  filet.txt  filew.txt  filez.txt
filec.txt  filef.txt  filei.txt  filel.txt  fileo.txt  filer.txt  fileu.txt  filex.txt

範例:比較有無*的功能區別

[root@centos8 data]#ls -a *
[root@centos8 data]#ls -a

範例:

[root@centos8 ~]#ls -d /etc/*/
[root@centos8 ~]#l.

範例:

[root@centos8 data]#touch file*.log
[root@centos8 data]#touch file1.log
[root@centos8 data]#ls file*.log
 file1.log  'file*.log'
[root@centos8 data]#ls 'file*.log'
'file*.log'
[root@centos8 data]#ls 'file*.log'

2.8、建立空檔案和重新整理時間

touch命令可以用來建立空檔案或重新整理檔案的時間

格式:

touch [OPTION]... FILE...

選項說明:

  • -a 僅改變 atime和ctime
  • -m 僅改變 mtime和ctime
  • -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的時間戳
  • -c 如果檔案不存在,則不予建立

範例:

[root@centos8 data]#touch f1.txt
[root@centos8 data]#ll
total 0
-rw-r--r-- 1 root root 0 Mar 23 11:30 f1.txt
[root@centos8 data]#ll  /etc/issue
-rw-r--r--. 1 root root 23 Jan  2 23:21 /etc/issue
[root@centos8 data]#touch /etc/issue
[root@centos8 data]#ll /etc/issue
-rw-r--r--. 1 root root 23 Mar 23 11:31 /etc/issue
[root@centos8 data]#stat /etc/issue
  File: /etc/issue
  Size: 23              Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 134345998   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    	root)
Access: 2020-03-23 11:31:20.030291332 +0800
Modify: 2020-03-23 11:31:20.030291332 +0800
Change: 2020-03-23 11:31:20.030291332 +0800
 Birth: -

[root@centos8 data]#date
Fri Dec 13 16:11:55 CST 2019
[root@centos8 data]#touch date -d "-1 day" +%F_%T.log
[root@centos8 data]#ls
2019-12-12_16:11:48.log
[root@centos8 data]#touch $(date -d "1 year" +%F_%T).log
[root@centos8 data]#ls
2019-12-12_16:11:48.log  2020-12-13_16:13:11.log

2.9、複製檔案和目錄

利用cp(copy)命令可以實現或目錄的複製

格式:

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

常用選項

  • -i 如果目標已存在,覆蓋前提示是否覆蓋
  • -n 不覆蓋,注意兩者順序
  • -r, -R 遞迴複製目錄及內部的所有內容
  • -a 歸檔,相當於-dR –preserv=all,常用於備份功能
  • -d --no-dereference –preserv=links 不復制原檔案,只複製連結名
  • --preserv[=ATTR_LIST]
    mode: 許可權
    ownership: 屬主屬組
    timestamp:
    links
    xattr
    context
    all
  • -p 等同–preserv=mode,ownership,timestamp
  • -v –verbose
  • -f –force
  • -u –update 只複製源比目標更新檔案或目標不存在的檔案
  • -b 目標存在,覆蓋前先備份,預設形式為filename~,只保留最近的一個備份
  • –backup=numbered 目標存在,覆蓋前先備份加數字字尾,形式為filename.~#~,可以保留多個版本
源\目標 不存在 存在且為檔案 存在且為目錄
一個檔案 新建DEST,並將SRC中內容填充至DEST中 將SRC中的內容覆蓋至DEST中 注意資料丟失風險! 建議用 –i 選項 在DEST下新建與原檔案同名的檔案,並將SRC中內容填充至新檔案中
多個檔案 提示錯誤 提示錯誤 在DEST下新建與原檔案同名的檔案,並將原檔案內容複製進新檔案中
目錄須使用-r選項 建立指定DEST同名目錄,複製SRC目錄中所有檔案至DEST下 提示錯誤 在DEST下新建與原目錄同名的目錄,並將SRC中內容複製至新目錄中

範例:

[16:21:08 root@centos8 ~]#cp ~wang/issue  /data/issue_wang.bak
-rw-r--r--. 1 root root 86 Dec 13 16:21 /data/issue_wang.bak
-rw-r--r--. 1 wang wang 86 Dec 13 16:18 /home/wang/issue
[16:21:44 root@centos8 ~]#cp  -p ~wang/issue /data/issue_wang2.bak
[16:22:07 root@centos8 ~]#ll  ~wang/issue /data/issue_wang2.bak
-rw-r--r--. 1 wang wang 86 Dec 13 16:18 /data/issue_wang2.bak
-rw-r--r--. 1 wang wang 86 Dec 13 16:18 /home/wang/issue
[16:23:19 root@centos8 ~]#cp /etc/sysconfig/  /data/
cp: -r not specified; omitting directory '/etc/sysconfig/'
[16:23:40 root@centos8 ~]#cp -r /etc/sysconfig/  /data/
[16:23:45 root@centos8 ~]#ll /data
total 12
-rw-r--r--. 1 root root    0 Dec 13 16:11 2019-12-12_16:11:48.log
-rw-r--r--. 1 root root    0 Dec 13 16:13 2020-12-13_16:13:11.log
-rw-r--r--. 1 wang wang   86 Dec 13 16:18 issue_wang2.bak
-rw-r--r--. 1 root root   86 Dec 13 16:21 issue_wang.bak
drwxr-xr-x. 7 root root 4096 Dec 13 16:23 sysconfig
[16:24:03 root@centos8 ~]#cp -r /etc/sysconfig/  /data/sysconfig_bak
[16:24:34 root@centos8 ~]#ll /data
total 16
-rw-r--r--. 1 root root    0 Dec 13 16:11 2019-12-12_16:11:48.log
-rw-r--r--. 1 root root    0 Dec 13 16:13 2020-12-13_16:13:11.log
-rw-r--r--. 1 wang wang   86 Dec 13 16:18 issue_wang2.bak
-rw-r--r--. 1 root root   86 Dec 13 16:21 issue_wang.bak
drwxr-xr-x. 7 root root 4096 Dec 13 16:23 sysconfig
drwxr-xr-x. 7 root root 4096 Dec 13 16:24 sysconfig_bak

[16:32:43 root@centos8 ~]#cp -b  /etc/motd /data/issue
cp: overwrite '/data/issue'? y 
[16:33:09 root@centos8 ~]#ll /data
total 8
-rw-r--r--. 1 root root    1 Dec 13 16:33 issue
-rw-r--r--. 1 root root 2610 Dec 13 16:32 issue~
[16:33:11 root@centos8 ~]#cp -b  /etc/fstab  /data/issue
cp: overwrite '/data/issue'? y
[16:33:55 root@centos8 ~]#ll /data
total 8
-rw-r--r--. 1 root root 709 Dec 13 16:33 issue
-rw-r--r--. 1 root root   1 Dec 13 16:33 issue~
[16:33:56 root@centos8 ~]#cp --backup=numbered   /etc/fstab  /data/issue
cp: overwrite '/data/issue'? y
[16:34:32 root@centos8 ~]#cp --backup=numbered   /etc/shadow  /data/issue
cp: overwrite '/data/issue'? y
[16:34:41 root@centos8 ~]#cp --backup=numbered   /etc/os-release  /data/issue
cp: overwrite '/data/issue'? y
[16:34:48 root@centos8 ~]#ll /data
total 20
-rw-r--r--. 1 root root  420 Dec 13 16:34 issue
-rw-r--r--. 1 root root    1 Dec 13 16:33 issue~
-rw-r--r--. 1 root root  709 Dec 13 16:33 issue.~1~
-rw-r--r--. 1 root root  709 Dec 13 16:34 issue.~2~
----------. 1 root root 1349 Dec 13 16:34 issue.~3~

範例:

[root@centos8 ~]#cp /dev/zero /data/zero.bak

練習
1、每天將/etc/目錄下所有檔案,備份到/data獨立的子目錄下,並要求子目錄格式為 backupYYYY-mm-dd,備份過程可見

[root@centos8 ~]#cp -av /etc/ /data/backupdate +%F

2、建立/data/rootdir目錄,並複製/root下所有檔案到該目錄內,要求保留原有許可權

[root@centos8 ~]#cp -a /root /data/rootdir

2.10、移動和重新命名檔案

mv 命令可以實現檔案或目錄的移動和改名

同一分割槽移動資料,速度很快:資料位置沒有變化

不同分割槽移動資料,速度相對慢:資料位置發生了變化

格式:

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

常用選項:

  • -i 互動式
  • -f 強制
  • -b 目標存在,覆蓋前先備份

利用rename 可以批量修改檔名

格式:

rename [options] <expression> <replacement> <file>...

範例:

#為所有的conf檔案加上.bak字尾: 
rename  'conf'    'conf.bak'   f* 
#去掉所有的bak字尾: 
rename  '.bak'  ''  *.bak

2.11、刪除檔案

使用 rm 命令可以刪除檔案

注意:此命令非常危險,慎重使用,建議使用mv 代替 rm

格式:

rm [OPTION]... FILE...

常用選項:

  • -i 互動式
  • -f 強制刪除
  • -r 遞迴
  • –no-preserve-root 刪除/

範例:

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

rm -rf    /*

範例:刪除特殊檔案

#將名為 “/data/-f” 的檔案刪除
[root@centos8 data]#rm -f -f  #此方式錯誤
[root@centos8 data]#rm -- -f
[root@centos8 data]#rm ./-f
[root@centos8 data]#rm /data/-f

[root@centos8 data]#touch '~'
[root@centos8 data]#ls
'~'
[root@centos8 data]#rm -f ~
rm: cannot remove '/root': Is a directory
[root@centos8 data]#rm -- ~
rm: cannot remove '/root': Is a directory
[root@centos8 data]#rm -f ./~

rm雖然刪除了檔案,但是被刪除的檔案仍然可能被恢復,在安全要求較高的場景下,可以使用shred安全刪除檔案

shred格式

shred [OPTION]... FILE...

常見選項:
-z 最後一次覆蓋新增0,以隱藏覆蓋操作
-v 能夠顯示操作進度
-u 覆蓋後截斷並刪除檔案
-n # 指定覆蓋檔案內容的次數(預設值是3次)

範例:

[root@centos8 ~]#shred  -zvun 5 passwords.txt
shred: passwords.txt: pass 1/6 (random)...
shred: passwords.txt: pass 2/6 (000000)...
shred: passwords.txt: pass 3/6 (random)...
shred: passwords.txt: pass 4/6 (ffffff)...
shred: passwords.txt: pass 5/6 (random)...
shred: passwords.txt: pass 6/6 (000000)...
shred: passwords.txt: removing
shred: passwords.txt: renamed to 0000000000000
shred: 0000000000000: renamed to 000000000000
shred: 000000000000: renamed to 00000000000
shred: 00000000000: renamed to 0000000000
shred: 0000000000: renamed to 000000000
shred: 000000000: renamed to 00000000
shred: 00000000: renamed to 0000000
shred: 0000000: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: passwords.txt: removed
[root@centos8 ~]#ls passwords.txt
ls: cannot access 'passwords.txt': No such file or directory

2.12、目錄操作

1、顯示目錄樹 tree

常見選項:

  • -d: 只顯示目錄
  • -L level:指定顯示的層級數目
  • -P pattern: 只顯示由指定wild-card pattern匹配到的路徑
2、建立目錄 mkdir

常見選項:

  • -p: 存在於不報錯,且可自動建立所需的各目錄
  • -v: 顯示詳細資訊
  • -m MODE: 建立目錄時直接指定許可權
3、刪除空目錄 rmdir

常見選項:

  • -p 遞迴刪除父空目錄
  • -v 顯示詳細資訊

注意:rmdir只能刪除空目錄,如果想刪除非空目錄,可以使用rm -r 命令,遞迴刪除目錄樹

範例:

alias rm='DIR=/data/backupdate +%F%T;mkdir DIR;mv -tDIR'

3.1、硬(hard)連結

硬連結本質上就給一個檔案起一個新的名稱,實質是同一個檔案

硬連結特性

​ 建立硬連結將會在對應的目錄中增加額外的記錄項以引用檔案

​ 對應的同一檔案系統上一個物理檔案

​ 每個目錄引用相同的inode號

​ 建立時連結遞增

​ 刪除檔案時:rm命令遞減計數的連結,檔案要存在,至少有一個連結數,當連結數為零時,該檔案被刪除

​ 不能跨越驅動器或分割槽

​ 不支援對目錄建立硬連結

格式:

ln filename [linkname]

3.2、符號symbolic (或軟soft)連結

一個符號連結指向另一個檔案,就像windows中快捷方式,軟連結檔案和原來檔案本質不是同一個檔案

軟連結的特點

一個符號連結的內容是它引用檔案的名稱

可以對目錄建立軟連結

可以跨分割槽的檔案實現

指向的是另一個檔案的路徑;其大小為指向的路徑字串的長度;不增加或減少目標檔案inode的引用計數

在建立軟連結時,如果原始檔使用相對路徑,是相對於軟連結檔案的路徑,而非相對於當前工作的目錄,但是軟連結的路徑如果是 相對路徑,則是相當於當前工作目錄

格式:

​ ln -s filename [linkname]

#絕對路徑
ln	-s	/data/dir	/data/dirlink

#相對路徑
cd	/data
ln -s ../data/dir	/root/dirlink
rm	-rf	/data/dirlink		#刪除軟連線本身,不會刪除源目錄內容
rm	-rf	/data/dirlink		#刪除源目錄的檔案,不會刪除軟連結檔案

#檢視連結檔案指向的原檔案
readlink	/data/dirlink

[root@zhang data]# readlink /proc/$$/exe
/usr/bin/bash

3.3、硬連結和軟連結區別總結

1、本質:

硬連結;本質是同一個檔案

軟連結:本質不是同一個檔案

2、跨裝置

硬連結:不支援

軟連線:支援

3、inode

硬連結:相同

軟連結:不同

4、連結數

硬連結:建立新的硬連結,連結數會增加,刪除硬連結,連結數減少

軟連線:建立或刪除,連結數不會變化

5、資料夾

硬連結:不支援

軟連線:支援

6、相對路徑

硬連結:原始檔案相對路徑是相對於目前工作目錄

軟連線:原始檔案的相對路徑是相當於連結檔案的相對路徑

7、刪除原始檔

硬連結:只是連結數減一,但連結檔案的訪問不受影響

軟連結:連結檔案將無法訪問

8、檔案型別

硬連結:和原始檔相同

軟連結:連結檔案,和原始檔無關

9、檔案大小

硬連結:和原始檔相同

軟連結:原始檔的路徑的長度

4、IO重定向和管道

4.1、標準輸入和輸出

程式:指令+資料

讀入資料:input

輸出資料:Output

開啟的檔案都有一個fd:file descriptor(檔案描述)

Linux給程式提供三種I/O裝置

標準輸入(STDIN) -0 預設接受來自終端視窗的輸入

標準輸出(STDOUT) -1 預設輸出到終端視窗

標準錯誤(STDERR) -2 預設輸出到終端視窗

範例:檔案描述符

[root@zhang data]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Dec  5 09:34 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Dec  5 09:34 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Dec  5 09:34 /dev/stdout -> /proc/self/fd/1
[root@zhang data]# ll /proc/self/fd/*
ls: cannot access /proc/self/fd/255: No such file or directory
ls: cannot access /proc/self/fd/3: No such file or directory
lrwx------. 1 root root 64 Dec  5 20:18 /proc/self/fd/0 -> /dev/pts/1
lrwx------. 1 root root 64 Dec  5 20:18 /proc/self/fd/1 -> /dev/pts/1
lrwx------. 1 root root 64 Dec  5 20:18 /proc/self/fd/2 -> /dev/pts/1

4.2、I/O重定向 redirect

1、標準輸出和錯誤重定向

STDOUT和STDERR可以被重定向到指定檔案,而非預設的當前終端

格式:

命令 操作符號 檔名

支援的操作符號包括:

1> 或 > 把STDOUT重定向到檔案

2> 把STDERR重定向到檔案

&> 把標準輸出和錯誤都重定向

 >&	    和上面功能一樣,建議使用上面方式
 
 以上如果檔案已存在,檔案內容會被覆蓋 

set -c 禁止將內容覆蓋已有檔案,但可追加,利用 > | 仍可強制覆蓋

set +c 允許覆蓋,預設

追加

可以在原有的內容基礎上,追加內容

把輸出和錯誤重新定向追加到檔案

》 》 追加標準輸出重定向至檔案

2>> 追加標準錯誤重定向至檔案

標準輸出和錯誤輸出各自定向至不同位置

COMMAND > /path/to/file.out 2> /path/to/error.out

合併標準輸出和錯誤輸出為同一個資料流進行重定向

&> 覆蓋重定向

&>> 追加重定向

COMMND > /path/to/file.out 2>&1 (順序很重要)

COMMAND >> /path/to/file.out 2>&1

合併多個程式

(CMD1;CMD2......)或者{CMD1;CMD2;......}合併多個程式的STDOUT

範例;

[root@zhang data]# ls 1> /dev/pts/1
linux.txt  win.txt
[root@zhang data]# ls /data > /dev/pts/1
linux.txt  win.txt
2、標準輸入重定向
1、tr命令

tr 轉換和刪除字元

tr [OPTION]... SET1 [SET2]

選項:

-d --delete:刪除所有屬於第一字符集的字元
-s --squeeze-repeats:把連續重複的字元以單獨一個字元表示,即去重
-t  --truncate-set1:將第一個字符集對應字元轉化為第二字符集對應的字元
-c –C --complement:取字符集的補集
\NNN      character with octal value NNN (1 to 3 octal digits)
\\       backslash
\a       audible BEL
\b       backspace
\f       form feed
\n       new line
\r       return
\t       horizontal tab
\v       vertical tab

[:alnum:]:字母和數字
[:alpha:]:字母
[:digit:]:數字
[:lower:]:小寫字母
[:upper:]:大寫字母
[:space:]:空白字元
[:print:]:可列印字元
[:punct:]:標點符號
[:graph:]:圖形字元
[:cntrl:]:控制(非列印)字元
[:xdigit:]:十六進位制字元

範例:

#該命令會把/etc/issue中的小寫字元都轉換成大寫字元
tr ‘a-z’  ‘A-Z’< /etc/issue
#刪除fstab檔案中的所有abc中任意字元
tr –d abc < /etc/fstab

範例;

[root@centos8 ~]#df
Filesystem   1K-blocks  Used Available Use% Mounted on
devtmpfs      910220    0   910220  0% /dev
tmpfs       924732    0   924732  0% /dev/shm
tmpfs       924732   9964   914768  2% /run
tmpfs       924732    0   924732  0% /sys/fs/cgroup
/dev/sda2    104806400 5256556  99549844  6% /
/dev/sda3    52403200  398588  52004612  1% /data
/dev/sda1     999320  131768   798740  15% /boot
tmpfs       184944    16   184928  1% /run/user/42
tmpfs       184944    4   184940  1% /run/user/0
tmpfs       184944   4656   180288  3% /run/user/1000
/dev/sr0     6967726 6967726     0 100% /run/media/wang/CentOS-8-BaseOS-
x86_64
[root@centos8 ~]#df > df.log
[root@centos8 ~]#tr -s ' ' < df.log
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 910220 0 910220 0% /dev
tmpfs 924732 0 924732 0% /dev/shm
tmpfs 924732 9964 914768 2% /run
tmpfs 924732 0 924732 0% /sys/fs/cgroup
/dev/sda2 104806400 5256556 99549844 6% /
/dev/sda3 52403200 398588 52004612 1% /data
/dev/sda1 999320 131768 798740 15% /boot
tmpfs 184944 16 184928 1% /run/user/42
tmpfs 184944 4 184940 1% /run/user/0
tmpfs 184944 4656 180288 3% /run/user/1000
/dev/sr0 6967726 6967726 0 100% /run/media/wang/CentOS-8-BaseOS-x86_64
[root@centos8 ~]#tr -s ' ' : < df.log
Filesystem:1K-blocks:Used:Available:Use%:Mounted:on
devtmpfs:910220:0:910220:0%:/dev
tmpfs:924732:0:924732:0%:/dev/shm
tmpfs:924732:9964:914768:2%:/run
tmpfs:924732:0:924732:0%:/sys/fs/cgroup

範例:將 Windows 的文字轉化 Linux的文字格式

[root@centos8 ~]#cat windows.txt
a
b
c[root@centos8 ~]#file windows.txt
windows.txt: ASCII text, with CRLF line terminators
[root@centos8 ~]#hexdump -C windows.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
[root@centos8 ~]#nano linux.txt
[root@centos8 ~]#hexdump -C linux.txt
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
[root@centos8 ~]#tr -d '\r' < windows.txt > windows2.txt
[root@centos8 ~]#hexdump -C windows2.txt
00000000 61 0a 62 0a 63 |a.b.c|
00000005
[root@centos8 ~]#file windows2.txt
windows2.txt: ASCII text

思考:將 Linux 的文字轉化 Windows 的文字格式 ?

2、標準輸入重定向

利用“<” 可以將標準輸入重定向
比如:
cat > file
mage
wangxiaochun
按ctrl+d離開,可以使用檔案來代替鍵盤的輸入
cat < file1 > file2
cat < file1 >> file1
範例:

[root@centos8 ~]#echo 2^3 > bc.log
[root@centos8 ~]#cat bc.log
2^3
[root@centos8 ~]#bc < bc.log
8
[root@centos8 ~]#cat < mail.txt
hello
how old are you
[root@centos8 ~]#cat mail.txt
hello
how old are you
[root@centos8 ~]#cat < mail.txt > mail2.txt
[root@centos8 ~]#cat mail2.txt
hello
how old are you
[root@centos8 ~]#cat mail.txt
hello
how old are you
[root@centos8 ~]#mail -s test2 wang < mail.txt
[root@centos8 ~]#cat > cat.log
line1
line2
line3
3、把多行重定向

使用 "<<終止詞" 命令從鍵盤把多行重導向給STDIN,直到終止詞位置之前的所有文字都發送給
STDIN,有時被稱為就地文字(here documents)

其中終止詞可以是任何一個或多個符號,比如:!,@,$,EOF(End Of File),magedu等,其中
EOF比較常用
範例:

mail-s"PleaseCall"[email protected]<<EOF
>HiWang
>
>Pleasegivemeacallwhenyougetin.Wemayneed
>todosomemaintenanceonserver1.
>
>Detailswhenyou'reon-site
>Zhang
>EOF

4.3、管道

1、管道
  管道(使用符號“|”表示)用來連線多個命令
  格式
  命令1 | 命令2 | 命令3 | …

功能說明:

將命令1的STDOUT傳送給命令2的STDIN,命令2的STDOUT傳送到命令3的STDIN
所有命令會在當前shell程序的子shell程序中執行
組合多種工具的功能

注意:STDERR預設不能通過管道轉發,可利用2>&1 或 |& 實現,格式如下

命令1 2>&1 | 命令2
命令1 |& 命令2
範例:

[root@centos8 ~]#df > df.log
[root@centos8 ~]#tr -s ' ' < df.log
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 910220 0 910220 0% /dev
tmpfs 924732 0 924732 0% /dev/shm
tmpfs 924732 9968 914764 2% /run
tmpfs 924732 0 924732 0% /sys/fs/cgroup
/dev/sda2 104806400 5256888 99549512 6% /
/dev/sda3 52403200 398588 52004612 1% /data
/dev/sda1 999320 131768 798740 15% /boot
tmpfs 184944 16 184928 1% /run/user/42
tmpfs 184944 4 184940 1% /run/user/0
tmpfs 184944 4656 180288 3% /run/user/1000
/dev/sr0 6967726 6967726 0 100% /run/media/wang/CentOS-8-BaseOS-x86_64
[root@centos8 ~]#df | tr -s ' '
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 910220 0 910220 0% /dev
tmpfs 924732 0 924732 0% /dev/shm
tmpfs 924732 9964 914768 2% /run
tmpfs 924732 0 924732 0% /sys/fs/cgroup
/dev/sda2 104806400 5256828 99549572 6% /
/dev/sda3 52403200 398588 52004612 1% /data
/dev/sda1 999320 131768 798740 15% /boot
tmpfs 184944 16 184928 1% /run/user/42
tmpfs 184944 4 184940 1% /run/user/0
tmpfs 184944 4656 180288 3% /run/user/1000
/dev/sr0 6967726 6967726 0 100% /run/media/wang/CentOS-8-BaseOS-x86_64

範例:

[root@centos8 ~]#ls /data /xxx | tr 'a-z' 'A-Z'
ls: cannot access '/xxx': No such file or directory
/DATA:
ALL.LOG
F1.TXT
PASSWD.LOG
STERR.LOG
STOUT.LOG
TEST.LOG
TOUCH.LOG
[root@centos8 ~]#ls /data /xxx 2>&1 | tr 'a-z' 'A-Z'
LS: CANNOT ACCESS '/XXX': NO SUCH FILE OR DIRECTORY
/DATA:
ALL.LOG
F1.TXT
PASSWD.LOG
STERR.LOG
STOUT.LOG
TEST.LOG
TOUCH.LOG
[root@centos8 ~]#ls /data /xxx |& tr 'a-z' 'A-Z'
LS: CANNOT ACCESS '/XXX': NO SUCH FILE OR DIRECTORY
/DATA:
ALL.LOG
F1.TXT
PASSWD.LOG
STERR.LOG
STOUT.LOG
TEST.LOG
TOUCH.LOG

範例:

[root@centos8 ~]#passwd --stdin wang
Changing password for user wang.
magedu
passwd: all authentication tokens updated successfully.
[root@centos8 ~]#cat pass.txt
centos
[root@centos8 ~]# passwd --stdin wang < pass.txt
Changing password for user wang.
passwd: all authentication tokens updated successfully.
[root@centos8 ~]#cat pass.txt | passwd --stdin wang
Changing password for user wang.
passwd: all authentication tokens updated successfully.
[root@centos8 ~]#echo magedu | passwd --stdin wang
Changing password for user wang.
passwd: all authentication tokens updated successfully.
[root@centos8 ~]#echo magedu | passwd --stdin wang &> /dev/null

範例:

#轉換為大寫字母
ls | tr ‘a-z’ ‘A-Z’
#less實現分頁地檢視輸入
ls -l /etc | less
#mail通過電子郵件傳送輸入
echo "test email" | mail -s "test" [email protected]
#算術運算
echo "2^3" |bc
2、tee命令

利用 tee 命令可以重定向到多個目標
格式
命令1 | tee [-a] 檔名 |命令2
以上可以把命令1的STDOUT儲存在檔案中,做為命令2的輸入
選項:

-a 追加

功能:

儲存不同階段的輸出
複雜管道的故障排除
同時檢視和記錄輸出
範例:

[root@centos8 ~]#echo {1..100}|tr ' ' +|bc
5050
[root@centos8 ~]#echo {1..100..2} | tr ' ' + | bc
2500
[root@centos8 ~]#seq -s + 1 100 |bc
5050
[root@centos8 ~]#seq -s+ 1 2 100 | bc
2500

範例:

[root@centos8 ~]#cat <<EOF | tee .mailrc
> set [email protected]
> set smtp=smtp.qq.com
> set [email protected]
> set smtp-auth-password=esvnhbnqocirbicf
> set smtp-auth=login
> set ssl-verify=ignore
> EOF
set [email protected]
set smtp=smtp.qq.com
set [email protected]
set smtp-auth-password=esvnhbnqocirbicf
set smtp-auth=login
set ssl-verify=ignore
[root@centos8 ~]#

範例:

[root@centos8 ~]#cat  <<EOF | tee /etc/motd
welcome to magedu
> happy new year
> EOF
welcome to magedu
happy new year
3、重定向中的 - 符號

管道中有時會使用 - 符號
示例:
將 /home 裡面的檔案打包,但打包的資料不是記錄到檔案,而是傳送到 stdout,經過管道後,將 tar -
cvf - /home 傳送給後面的 tar -xvf - , 後面的這個 - 則是取前一個命令的 stdout, 因此,就不需要使用
臨時file了

tar -cvf - /home | tar -xvf -