第2周課程練習
1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。
1.1、ls
ls: list列出目錄內容,顯示指定路徑下的文件列表;
格式
ls [OPTION]… [DIR]…
常用選項:
-a, –all: 顯示所有文件,包括隱藏文件;
-l: 長格式
-rw-r–r– 1 root root 44800 Aug 14 14:32 install.log
-rw-r–r–
最左側的第一位:文件類型
-, d, l, b, c, p, s
后面的9位:訪問權限,perm
文件被硬鏈接的次數 文件的owner 文件的group 文件的size 文件的最近一次被修改的時間 文件名
-h, –human-readable:單位換算
-d: 顯示目錄自身的相關屬性;通常要與-l一起使用;
-r, –reverse: 逆序顯示
-R, –recursive: 遞歸
1.2、cd
cd: 改變shell的工作目錄,內部命令
cd 或 cd ~: 回當前用戶的主目錄
cd ~USERNAME: 切換至指定用戶的主目錄
cd -: 在上一個目錄和當前目錄之間來回切換
1.3、文件內容類型查看命令file
file:用于查看普通文件和系統文件的類型
格式:
file /PATH/TO/SOMEWHERE
常用選項:
-b:列出文件辨識結果時,不顯示文件名稱
-i:輸出mime類型的字符串
1.4、文件查看命令cat、tac、more、less、head、tail
cat:連接并顯示文件的信息,是全部顯示文件內的信息
cat [OPTION]… [FILE]…
-E: 顯示行結束符$
-n: 對顯示出的每一行進行編號
tac:反向輸出文件內容
more:more的作用同cat是相同的,只不過這時我們可以通過手動來翻屏,更加方便. 只支持向后翻,翻到最后就直接退出
more [OPTIONS…] FILE…
-d: 顯示翻頁及退出提示
less: 顯示文件信息,默認不退出顯示,q即可退出
less [OPTIONS…] FILE…
空格:向后翻一屏
b:向前翻一屏
ENTER:向后翻一行
k:向前翻一行
關鍵字查找: /KEYWORD:查找關鍵字
head:顯示文件的前幾行,默認是10行
head [OPTION]… [FILE]…
-c #: 指定獲取前#字節
-n #: 指定獲取前#行
tail:顯示文件的后幾行,默認是10行
tail [OPTION]… [FILE]…
-c #: 指定獲取后#字節
-n #: 指定獲取后#行
-f: 跟蹤顯示文件新追加的內容;
1.5、tree:以目錄樹的形式顯示目錄
-d: 只顯示目錄
-L level:指定顯示的層級數目
-P pattern: 只顯示由指定pattern匹配到的路徑;
1.6、目錄創建刪除mkdir、rmdir
mkdir:創建目錄
mkdir [options] /path/to/somewhere
-p: 遞歸,存在也不報錯,且可自動創建所需的各目錄;
-v: 顯示詳細信息
-m MODE: 創建目錄時直接指定權限;
rmdir:刪除空目錄
rmdir [OPTION]… DIRECTORY…
-v: 顯示過程;
-r:遞歸刪除
-f:強行刪除
1.7、文件的時間戳管理工具touch
文件:是由metadata和data組成
查看文件狀態:stat
三個時間戳:
access time:訪問時間,簡寫為atime,讀取文件內容
modify time: 修改時間, mtime,改變文件內容(數據)
change time: 改變時間, ctime,元數據發生改變
touch命令:創建文件
touch [OPTION]… FILE…
-a: only atime只改變文件的訪問時間
-m: only mtime只改變文件的修改時間
-t STAMP: 只改變文件的修改時間
[[CC]YY]MMDDhhmm[.ss]
-c: 如果文件不存,則不予創建
1.8、文件管理類命令cp、mv、rm
復制命令:cp文件復制
cp [OPTION]… [-T] SOURCE DEST
cp [OPTION]… SOURCE… DIRECTORY
cp [OPTION]… -t DIRECTORY SOURCE…
法則:
1、cp SRC DEST
SRC是文件:如果目標不存在:新建DEST,并將SRC中內容填充至DEST中;如果目錄存在:如果DEST是文件:將SRC中的內容覆蓋至DEST中;此時建議為cp命令使用-i選項;如果DEST是目錄:在DEST下新建與原文件同名的文件,并將SRC中內容填充至新文件中;
2、cp SRC… DEST
SRC…:多個文件:DEST必須存在,且為目錄,其它情形均會出錯;
3、cp SRC DEST
SRC是目錄:此時一定要使用選項:-r。如果DEST不存在:則創建指定目錄,復制SRC目錄中所有文件至DEST中;如果DEST存在:如果DEST是文件:報錯;如果DEST是目錄:復制SRC目錄中所有目錄至DEST目錄下。
常用選項:
-i:交互式
-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:強制復制,覆蓋
mv: move,移動文件或重命名文件
mv [OPTION]… [-T] SOURCE DEST
mv [OPTION]… SOURCE… DIRECTORY
mv [OPTION]… -t DIRECTORY SOURCE…
常用選項:
-i: 交互式
-f: 強制
法則:
1、source是個文件:如果dest存在且是個文件,將source的內容填充至存在的文件中,且刪除source的文件(覆蓋);dest是個目錄,則在目標目錄下創建一個于源文件同名的文件。如果dest不存在,則以指定的名字命名,將source的內容填充,然后刪除源文件
2、source是多個文件:則目標必須存在,且是一個目錄
3、source是個目錄:不加以區分目錄和文件(同一個目錄下操作相當于重命名)
rm: remove,刪除
rm [OPTION]… FILE…
常用選項:
-i: 交互式
-f: 強制刪除
-r: 遞歸
rm -rf:強制刪除指定目錄及目錄下所有文件
–preserve-root:默認不允許刪除根
2、bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。
2.1、命令執行狀態返回值
程序執行有兩類結果:
程序的返回值;
程序的執行狀態結果;
在 Linux 下,不管你是啟動一個桌面程序也好,還是在控制臺下運行命令,所有的程序在結束時,都會返回一個數字值,這個值叫做返回值,或者稱為錯誤號 ( Error Number )。
只要返回值是 0,就代表程序執行成功
如果 $? 變量的值不是 0 的話,就表示上一個命令在執行的過程中出錯了。1-255都表示失敗。
2.2、命令行展開
2.2.1、花括號展開
在非引號內的內容,如果用花括號包括,而且里面用逗號分隔(至少包含一個逗號,可以是空內容),這樣花括號里的內容會被展開成用空格分開的一個列表,花括號前后可以緊隨前綴和后綴(前后綴都是可選的)。
2.2.2、波浪號展開
從波浪號~到第一個未被引號包含的斜杠/(如果沒有斜杠,則全部算上),作為波浪號前綴。在波浪號后面的字符串作為一個可能的登錄名:如果為空,被展開成該用戶的HOME變量,如果HOME變量未設置,則用用戶執行shell的主目錄替換。如果不為空,則按照該登錄名的主目錄替換
~: 展開為用戶的主目錄
~USERNAME:展開為指定用戶的主目錄
2.2.3、Shell參數和變量展開
用$符號開始,后面接著變量名或者花括號括起來的變量名,如果是花括號內以嘆號開頭,那么就是變量名本身。
echo $PWD # 顯示PWD對應的值
echo ${PWD} # 顯示PWD對應的值
echo ${!PWD} # 顯示“PWD”這個變量名,而不是它的值
echo ${!P*} # 顯示所有以P開頭的環境變量名
如果一個變量名不存在,就創建它。
echo ${HELLO:=hello} # 如果HELLO不存在,就用hello給它賦值,否則直接輸出$HELLO的值
3、請使用命令行展開功能來完成以下練習:
(1)、創建/tmp目錄下的:a_c, a_d, b_c, b_d
touch /tmp/{a,b}_{c,d}
(2)、創建/tmp/mylinux目錄下的:
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └── network-scripts
├── lib
│ └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│ └── local
│ ├── bin
│ └── sbin
└── var
├── lock
├── log
└── run
mkdir -p /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
4、文件的元數據信息有哪些,分別表示什么含義,如何查看?如何修改文件的時間戳信息。
任何文件系統中的數據分為數據和元數據。數據是指普通文件中的實際數據,而元數據指用來描述一個文件的特征的系統數據,諸如訪問權限、文件擁有者以及文件數據塊的分布信息(inode…)等等。
元數據用于記錄文件的許多信息,比如文件大小,擁有人,所屬的組,修改日期等等。元數據并不包含在文件的數據中,而是由操作系統維護的。事實上,這個所謂的元數據就包含在inode中。我們可以用$ls -l來查看這些元數據。正如我們上面看到的,inode所占據的區域與數據塊的區域不同。每個inode有一個唯一的整數編號(inode number)表示。
在保存元數據,inode是“文件”從抽象到具體的關鍵。inode儲存有一些指針,這些指針指向存儲設備中的一些數據塊,文件的內容就儲存在這些數據塊中。當Linux想要打開一個文件時,只需要找到文件對應的inode,然后沿著指針,將所有的數據塊收集起來,就可以在內存中組成一個文件的數據了。
inode并不是組織文件的唯一方式。最簡單的組織文件的方法,是把文件依次順序的放入存儲設備,DVD就采取了類似的方式。但如果有刪除操作,刪除造成的空余空間夾雜在正常文件之間,很難利用和管理。
復雜的方式可以使用鏈表,每個數據塊都有一個指針,指向屬于同一文件的下一個數據塊。這樣的好處是可以利用零散的空余空間,壞處是對文件的操作必須按照線性方式進行。如果想隨機存取,那么必須遍歷鏈表,直到目標位置。由于這一遍歷不是在內存進行,所以速度很慢。
FAT系統是將上面鏈表的指針取出,放入到內存的一個數組中。這樣,FAT可以根據內存的索引,迅速的找到一個文件。這樣做的主要問題是,索引數組的大小與數據塊的總數相同。因此,存儲設備很大的話,這個索引數組會比較大。
inode既可以充分利用空間,在內存占據空間不與存儲設備相關,解決了上面的問題。但inode也有自己的問題。每個inode能夠存儲的數據塊指針總數是固定的。如果一個文件需要的數據塊超過這一總數,inode需要額外的空間來存儲多出來的指針。
例如:在Linux中,我們通過解析路徑,根據沿途的目錄文件來找到某個文件。目錄中的條目除了所包含的文件名,還有對應的inode編號。當我們輸入$cat /var/test.txt時,Linux將在根目錄文件中找到var這個目錄文件的inode編號,然后根據inode合成var的數據。隨后,根據var中的記錄,找到text.txt的inode編號,沿著inode中的指針,收集數據塊,合成text.txt的數據。整個過程中,我們參考了三個inode:根目錄文件,var目錄文件,text.txt文件的inodes。
在Linux下,可以使用$stat filename,來查詢某個文件對應的inode編號。
在存儲設備中實際上存儲為:
當我們讀取一個文件時,實際上是在目錄中找到了這個文件的inode編號,然后根據inode的指針,把數據塊組合起來,放入內存供進一步的處理。當我們寫入一個文件時,是分配一個空白inode給該文件,將其inode編號記入該文件所屬的目錄,然后選取空白的數據塊,讓inode的指針指像這些數據塊,并放入內存中的數據。
使用stat /PATH/TO/SOMEFILE來獲取指定文件的元數據
Access:最后訪問時間
Modify:最后修改時間
Change:狀態更改時間(由系統維護,無法隨意修改)
touch -a :僅更新Access time(同時更新Change為current time)
touch -m:僅更新Modify time(同時更新Change為current time)
touch -c:不創建新文件
touch -t:使用指定的時間更新時間戳(僅更改Access time與Modify time,Change time更新為current time)
5、如何定義一個命令的別名,如何在命令中引用另一個命令的執行結果?
5.1定義別名
命令別名,通過alias命令實現:
(1)alias:顯示當前shell進程所有可用的命令別名;
(2)alias NAME='VALUE'
定義別名NAME,其相當于執行命令VALUE;
注意:
在命令行中定義的別名,僅對當前shell進程有效;如果想永久有效,要定義在配置文件中;
僅對當前用戶:~/.bashrc
對所有用戶有效:/etc/bashrc
bash進程重新讀取配置文件:
source /path/to/config_file
./path/to/config_file
撤消別名:unalias
unalias [-a] name [name …]
如果別名同原命令的名稱,則如果要執行原命令,可使用"\COMMAND";
5.2、命令引用
5.2.1、命令引用和替換(通過變量的方式)
引用:就是指將字符串用引用符號括起來,以防止特殊字符被shell腳本解釋為其他意義。引用時屏蔽特殊字符的特殊意義,而將其解釋為字面意義。
替換:將命令的標準輸出作為值賦給某個變量,bash Shell定義了兩種形式進行命令的替換,兩種形式的語法格式如下:
方式一: `COMMAND`
方式二: $(COMMAND)
5.2.2、管道和重定向
重定向:通常在Shell命令中最常見到三種輸入輸出類型,標準輸入(stdin),標準輸出(stdout)以及標準錯誤輸出(stderr),感覺跟C/C++里邊文件劃分類似。 stdin一般指command接受的輸入流,stdout指command正常輸出情況,默認輸出顯示到終端,stderr則是command的錯誤輸出,默認也是輸出顯示到終端。 而文件描述符則是與一個打開的文件或數據流相對應的一個整數,系統將0,1,2分別與標準輸入,標準輸出以及標準錯誤輸出相對應。
1)輸出重定向:
重定向符號>以及>>意為輸出重定向,包括標準輸出以及標準錯誤輸出,也是一般命令中比較常見的情況,與stdout及stderr兩兩組合就是四種情況
1>表示標準輸出重定向,覆蓋
1>>表示標準輸出重定向,追加
2>表示標準錯誤輸出重定向,覆蓋
2>> 表示標準錯誤輸出重定向,追加
標準輸出和錯誤輸出各自定向至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
合并標準輸出和錯誤輸出為同一個數據流進行重定向:
&>:覆蓋重定向
&>>:追加重定向
2)輸入重定向:
和輸出重定向一樣,Unix 命令也可以從文件獲取輸入,語法為:
command < file
這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容。
Here Document
Here Document 目前沒有統一的翻譯,這里暫譯為”嵌入文檔“。Here Document 是 Shell 中的一種特殊的重定向方式
# cat << EOF
# cat > /path/to/somefile << EOF
它的作用是將兩個EOF 之間的內容(document) 作為輸入傳遞給 command。
注意:
結尾的EOF 一定要頂格寫,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 縮進。
tr命令:轉換或刪除字符
格式:tr [OPTION]… SET1 [SET2]
-d:可以實現刪除出現在字符集中的所有字符
3)管道:
COMMAND1 | COMMAND2 | COMMAND3 |…
最后一個命令會在當前shell進程的子shell進程中執行;
6、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。
# ls -d /var/l*[0-9]*[a-z]
7、顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄。
# ls -d /etc/[0-9]*[^0-9]
8、顯示/etc目錄下,以非字母開頭,后面跟了一個字母以及其它任意長度任意字符的文件或目錄。
# ls -d /etc/[^[:alpha:]][[:alpha:]]*
9、在/tmp目錄下創建以tfile開頭,后跟當前日期和時間的文件,文件名形如:tfile-2016-05-27-09-32-22。
mkdir /tmp/tfile-`date +%Y-%m-%d-%H-%M-%S`
10、復制/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中。
# mkdir /tmp/mytest1
# cp -r /etc/p*[^[:digit:]] /tmp/mytest1
11、復制/etc目錄下所有以.d結尾的文件或目錄至/tmp/mytest2目錄中。
# mkdir /tmp/mytest2
# cp -r /etc/*.d /tmp/mytest2
12、復制/etc/目錄下所有以l或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中。
# mkdir /tmp/mytest3
# cp -r /etc/[lmn]*.conf /tmp/mytest3
原創文章,作者:N21_我愛羅,如若轉載,請注明出處:http://www.www58058.com/22254
寫的很好,排版還可以在漂亮一點,就不要貼黑屏的截圖了,加油