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 -