bash基礎特性、文本查看、文件管理命令實踐

本文涉及mkdir、rmdir、bash快捷鍵、head、tail、more、less、stat、touch、cp、mv、rm等命令的簡單使用

此爲Sunny,王苗苗同學的學習筆記,持續學習,持續分享,持續進步,向着大神之路前進

bash 命令補全

命令補全:shell程序在接收到用戶執行命令的請求,分析完成之後,最左側的字符串會被當作命令
命令查找機制:先查找內部命令;再根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名;

1、給定的打頭字符串如果能惟一標識某命令程序文件,則直接補全
2、不能惟一標識某命令程序文件,再擊tab鍵一次,會給出列表

路徑補全:在給定的起始路徑下,以對應路徑下的打頭字串來逐一匹配起始路徑下的每個文件
tab:如果能惟一標識,則直接補全;否則,再一次tab,給出列表;

目錄管理類命令:mkdir ,rmdir
創建目錄:mkdir [OPTION]… DIRECTORY…
-p: 自動按需創建父目錄
-v: verbose,顯示詳細過程;
-m MODE:直接給定權限

[root@redhat tmp]# ls
conf.d  haha  haha   man  sunny  sunny1.txt  test  vmware-root
#/tmp下沒有a目錄,要求在a下創建b目錄,報錯
[root@redhat tmp]# mkdir /tmp/a/b
mkdir: cannot create directory ‘/tmp/a/b’: No such file or directory
#使用-p,則可以按照你的需求,先創建a,再創建b
[root@redhat tmp]# mkdir -p  /tmp/a/b
[root@redhat tmp]# ls
a  conf.d  haha  haha   man  sunny  sunny1.txt  test  vmware-root
[root@redhat tmp]# ls a
b
#用-v查看-p的創建過程
[root@redhat tmp]# mkdir -pv /tmp/a/d/f
mkdir: created directory ‘/tmp/a/d’
mkdir: created directory ‘/tmp/a/d/f’
[root@redhat tmp]# ll a
total 0
drwxr-xr-x. 3 root root 14 Apr  6 11:49 b
drwxr-xr-x. 3 root root 14 Apr  6 11:49 d
#使用-m給創建的目錄賦予權限
[root@redhat tmp]# mkdir -m 555 -pv /tmp/b/d
mkdir: created directory ‘/tmp/b’
mkdir: created directory ‘/tmp/b/d’
#查看創建出來的d文件權限爲555
[root@redhat tmp]# ll b
total 0
dr-xr-xr-x. 2 root root 6 Apr  6 11:50 d

rmdir:刪除一個空目錄
rmdir [OPTION]… DIRECTORY…
-p:刪除某目錄後,如果其父目錄爲空,則一併刪除之;慎用
-v: 顯示過程;

bash 命令行展開

~:自動展開爲用戶的家目錄,或指定的用戶的家目錄
{}:可承載一個以逗號分隔的路徑列表,並能夠將其展開爲多個路徑;例如:/tmp/{a,b} 相當於 /tmp/a /tmp/b
此命令可用於創建多個文件,多級結果
例如我要創建一個這樣的層級目錄
mkdir /tmp/sunny{1…5} 一次性創建sunny1 sunny2 sunny3 sunny4 sunny5 5個目錄
mkdir /tmp/{y1/{a,b,c},y2}

#一次創建多層級目錄
[root@redhat tmp]# mkdir -pv /tmp/{y1/{a,b,c},y2}
mkdir: created directory ‘/tmp/y1’
mkdir: created directory ‘/tmp/y1/a’
mkdir: created directory ‘/tmp/y1/b’
mkdir: created directory ‘/tmp/y1/c’
mkdir: created directory ‘/tmp/y2’
一次創建多個文件
[root@redhat tmp]# mkdir sunny{1..5}
[root@redhat tmp]# ls
sunny1  sunny2  sunny3  sunny4  sunny5  y1  y2

可使用tree命令查看層級目錄
tree [options] [directory]
-L level:指定要顯示的層級;

bash的基礎特性:命令的執行狀態結果

命令執行的狀態結果:
bash通過狀態返回值來輸出此結果;成功:0;失敗:1-255
命令執行完成之後,其狀態返回值保存於bash的特殊變量$?中;
可使用echo $?查看上一條命令是否成功執行

bash快捷鍵

Ctrl+a:跳轉至命令行行首
Ctrl+e:跳轉至命令行行尾
Ctrl+u:刪除行首至光標所在處之間的所有字符
Ctrl+k:刪除光標所在處至行尾的所有字符
Ctrl+l:清屏,相當於clear
Ctrl+w:刪除前一個單詞

文件查看類命令

分屏查看more和less
more:more FILE
less:less FILE

查看前n行[head]和查看後n行[tail]
head假設查看前10行:head -n 10 /etc/passwd
或者head -10 /etc/passwd

tail同理:查看最後3行
tail -n 3 /etc/passwd
tail -3 /etc/passwd
-f:查看文件尾部內容結束後不退出,跟隨顯示新增的行。此參數經常用來查看實時日誌。
例如:tail -f /var/log/message 當這個文件有新家的行時,會追加在後面顯示。

stat命令
stat FILE
文件有兩類數據:一個是元數據metadata,一個是數據data。

元數據指的是文件的屬性,而數據纔是文件的內容;屬性指的是文件名、大小、權限、時間戳等信息。stat FILE看到的就是元數據,而cat看到的內容則是數據

Access: 2020-04-06 10:42:15.240548108 +0800 最近訪問時間,訪問的是文件內容,及讀取文件信息【access time】
Modify: 2020-04-06 10:42:14.287548042 +0800 文件最近內容的最後修改時間(指的是修改數據)【modify time】
Change: 2020-04-06 10:42:14.287548042 +0800 文件屬性的最後修改時間(指的是子修改元數據)【change time】

#查看sunny.txt的狀態信息,最後三個時間都顯示是4.4號
[root@redhat tmp]# stat sunny.txt 
  File: ‘sunny.txt’
  Size: 12        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857153   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-04 14:43:42.492347601 +0800
Modify: 2020-04-04 14:43:36.550347189 +0800
Change: 2020-04-04 14:43:36.550347189 +0800
 Birth: -
 #訪問sunny.txt文件,再查看文件狀態信息
[root@redhat tmp]# cat sunny.txt 
hello sunny
#發現Access時間變了,access是最後訪問時間,剛剛訪問了,時間也就變了
[root@redhat tmp]# stat sunny.txt 
  File: ‘sunny.txt’
  Size: 12        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857153   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:02:32.036632362 +0800
Modify: 2020-04-04 14:43:36.550347189 +0800
Change: 2020-04-04 14:43:36.550347189 +0800
 Birth: -
 #再來修改一下sunny.txt的文件內容,查看stat
[root@redhat tmp]# echo "today is 20200406" >> sunny.txt 
#發現最後兩個時間都有變化,這是因爲文件內容變了後,它的屬性也會變化,例如文件大小就變了,因爲文件內容及文件屬性都有變化,所以最後兩個時間都變了。
[root@redhat tmp]# stat sunny.txt 
  File: ‘sunny.txt’
  Size: 30        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857153   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:02:32.036632362 +0800
Modify: 2020-04-06 11:03:09.592634963 +0800
Change: 2020-04-06 11:03:09.592634963 +0800
 Birth: -
 #試着把文件名稱改了,也就是修改了文件屬性,查看stat
[root@redhat tmp]# mv sunny.txt sunny1.txt 
#發現只有change的時間變化了,這是因爲文件屬性變了,而文件內容沒變,所以只是更改了change時間
[root@redhat tmp]# stat sunny1.txt 
  File: ‘sunny1.txt’
  Size: 30        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857153   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:02:32.036632362 +0800
Modify: 2020-04-06 11:03:09.592634963 +0800
Change: 2020-04-06 11:08:25.466656835 +0800
 Birth: -

上面三個時間戳是可以手動修改的,使用touch命令

touch 命令:修改文件的時間戳
touch - change file timestamps
touch [OPTION]… FILE…
-c :指定的文件路徑不存在時不予創建
-a:僅修改access time
-m:僅修改modify time
-t STAMP 自己指定要改爲什麼時間
[[CC]YY]MMDDhhmm[.ss] 時間格式: 年月日時分秒

#查看sunny1.txt文件屬性,注意時間
[root@redhat tmp]# stat sunny1.txt 
  File: ‘sunny1.txt’
  Size: 30        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857153   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:02:32.036632362 +0800
Modify: 2020-04-06 11:03:09.592634963 +0800
Change: 2020-04-06 11:08:25.466656835 +0800
 Birth: -
 #touch sunny1.txt後發現三個時間全部變爲當前時間了,那有沒有隻修改某個時間戳呢?可以加上參數-a -m來指定修改哪個時間
[root@redhat tmp]# touch sunny1.txt 
[root@redhat tmp]# stat sunny1.txt 
  File: ‘sunny1.txt’
  Size: 30        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857153   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:18:23.605698251 +0800
Modify: 2020-04-06 11:18:23.605698251 +0800
Change: 2020-04-06 11:18:23.605698251 +0800
 Birth: -

#查看haha文件的狀態屬性
[root@redhat tmp]# stat haha
  File: ‘haha’
  Size: 24        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857156   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-04 13:56:06.995149879 +0800
Modify: 2020-04-04 13:55:47.895148556 +0800
Change: 2020-04-04 13:56:01.342149487 +0800
 Birth: -
 #使用-a 指定修改訪問時間
[root@redhat tmp]# touch -a haha
#查看,發現訪問時間與更改時間都變化了,這是因爲change time沒辦法修改的,它就是指的當前時間
[root@redhat tmp]# stat haha
  File: ‘haha’
  Size: 24        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857156   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:19:29.772702833 +0800
Modify: 2020-04-04 13:55:47.895148556 +0800
Change: 2020-04-06 11:19:29.772702833 +0800
 Birth: -
 #使用-m 來修改 文件內容的修改時間
[root@redhat tmp]# touch -m haha
[root@redhat tmp]# stat haha
  File: ‘haha’
  Size: 24        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857156   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:19:29.772702833 +0800
Modify: 2020-04-06 11:21:16.158710199 +0800
Change: 2020-04-06 11:21:16.158710199 +0800
 Birth: -
 #使用-t 來指定一個時間,例如指定文件內容修改時間爲2019年1月1號6點00分30秒
[root@redhat tmp]# touch -m -t 201901010600.30 haha
#查看,發現mtime變爲了上面設置的時間
[root@redhat tmp]# stat haha
  File: ‘haha’
  Size: 24        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857156   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-04-06 11:19:29.772702833 +0800
Modify: 2019-01-01 06:00:30.000000000 +0800
Change: 2020-04-06 11:22:14.797714260 +0800
 Birth: -
 #也可以使用-t來修改訪問時間
[root@redhat tmp]# touch -a -t 20200101190030.00 haha
touch: invalid date format ‘20200101190030.00’
[root@redhat tmp]# touch -a -t 202001011900.00 haha
[root@redhat tmp]# stat haha
  File: ‘haha’
  Size: 24        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 102857156   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2020-01-01 19:00:00.000000000 +0800
Modify: 2019-01-01 06:00:30.000000000 +0800
Change: 2020-04-06 11:23:19.401718733 +0800
 Birth: -

文件管理工具cp,mv,rm

	cp命令:copy
      	單源複製:cp [OPTION]... [-T] SOURCE DEST
       		如果DEST不存在:則事先創建此文件,並複製源文件的數據流至DEST中;
       		如果DEST存在:
       			如果DEST是非目錄文件:則覆蓋目標文件;
       			如果DEST是目錄文件:則先在DEST目錄下創建一個與源文件同名的文件,並複製其數據流;

       	多源複製:cp [OPTION]... SOURCE... DIRECTORY
       			  cp [OPTION]... -t DIRECTORY SOURCE...

       		如果DEST不存在:錯誤;
       		如果DEST存在:
       			如果DEST是非目錄文件:錯誤;
       			如果DEST是目錄文件:分別複製每個文件至目標目錄中,並保持原名;

       	常用選項:
       		-i:交互式複製,即覆蓋之前提醒用戶確認;
       		-f:強制覆蓋目標文件;
       		-r, -R:遞歸複製目錄;
       		-d:複製符號鏈接文件本身,而非其指向的源文件;
       		-a:-dR --preserve=all, archive,用於實現歸檔;
       		--preserv=
       			mode:權限
       			ownership:屬主和屬組
       			timestamps: 時間戳
       			context:安全標籤
       			xattr:擴展屬性
       			links:符號鏈接
       			all:上述所有屬性

    mv命令:move
       mv [OPTION]... [-T] SOURCE DEST
       mv [OPTION]... SOURCE... DIRECTORY
       mv [OPTION]... -t DIRECTORY SOURCE..	    	

       常用選項:
       		-i:交互式;
       		-f:force

    rm命令:remove
    	rm [OPTION]... FILE...

    	常用選項:
    		-i:interactive 交互式
    		-f:force 強制
    		-r: recursive 遞歸

    		刪除目錄:rm -rf /PATH/TO/DIR
    			危險操作:rm -rf /*

    	注意:所有不用的文件建議不要直接刪除,而是移動至某個專用目錄;(模擬回收站)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章