1、Linux管理文件和目錄的命令
命令 | 功能 | 命令 | 功能 |
pwd | 顯示當前目錄 | ls | 查看目錄下的內容 |
cd | 改變所在目錄 | cat | 顯示文件的內容 |
grep | 在文件中查找某字符 | cp | 復制文件 |
touch | 創建文件 | mv | 移動文件 |
rm | 刪除文件 | rmdir | 刪除目錄 |
1.1 pwd命令
該命令的英文解釋為print working directory(打印工作目錄)。輸入pwd命令,Linux會輸出當前目錄。
1.2 cd命令
cd命令用來改變所在目錄。
cd / 轉到根目錄中
cd ~ 轉到/home/user用戶目錄下
cd /usr 轉到根目錄下的usr目錄中————-絕對路徑
cd test 轉到當前目錄下的test子目錄中——-相對路徑
1.3 ls命令
ls命令用來查看目錄的內容。
選項 | 含義 |
-a | 列舉目錄中的全部文件,包括隱藏文件 |
-l | 列舉目錄中的細節,包括權限、所有者、組群、大小、創建日期、文件是否是鏈接等 |
-f | 列舉的文件顯示文件類型 |
-r | 逆向,從后向前地列舉目錄中內容 |
-R | 遞歸,該選項遞歸地列舉當前目錄下所有子目錄內的內容 |
-s | 大小,按文件大小排序 |
-h | 以人類可讀的方式顯示文件的大小,如用K、M、G作單位 |
ls -l examples.doc | 列舉文件examples.doc的所有信息 |
1.4 cat命令
cat命令可以用來合并文件,也可以用來在屏幕上顯示整個文件的內容。
cat snow.txt 該命令顯示文件snow.txt的內容,ctrl+D退出cat。
1.5 grep命令
grep命令的最大功能是在一堆文件中查找一個特定的字符串。
grep money test.txt
以上命令在test.txt中查找money這個字符串,grep查找是區分大小寫的。
1.6 touch命令
touch命令用來創建新文件,他可以創建一個空白的文件,可以在其中添加文本和數據。
touch newfile 該命令創建一個名為newfile的空白文件。
1.7 cp命令
cp命令用來拷貝文件,要復制文件,輸入命令:
cp <source filename> <target filename>
cp t.txt Document/t 該命令將把文件t.txt復制到Document目錄下,并命名為t。
選項 | 含義 |
-i | 互動:如果文件將覆蓋目標中的文件,他會提示確認 |
-r | 遞歸:這個選項會復制整個目錄樹、子目錄以及其他 |
-v | 詳細:顯示文件的復制進度 |
1.8 mv命令
mv命令用來移動文件。
選項 | 說明 |
-i | 互動:如果選擇的文件會覆蓋目標中的文件,他會提示確認 |
-f | 強制:它會超越互動模式,不提示地移動文件,屬于很危險的選項 |
-v | 詳細:顯示文件的移動進度 |
mv t.txt Document 把文件t.txt 移動到目錄Document中。
1.9 rm命令
rm命令用來刪除文件。
選項 | 說明 |
-i | 互動:提示確認刪除 |
-f | 強制:代替互動模式,不提示確認刪除 |
-v | 詳細:顯示文件的刪除進度 |
-r | 遞歸:將刪除某個目錄以及其中所有的文件和子目錄 |
rm t.txt 該命令刪除文件t.txt
1.10 rmdir命令
rmdir命令用來刪除目錄
2、Linux下一條命令或一個進程執行完成會返回一個一個狀態碼。
0 === 成功執行
非0 === 執行過程中出現異常或非正常退出
在Shell腳本中 最后執行的一條命令將決定整個shell腳本的狀態. 此外 shell的內部命令exit也可以隨時終止shell腳本的執行,返回Shell腳本的狀態碼
當shell腳本執行結束前 的最后一個命令是不帶參數的exit ,那么 shell腳本的最終返回值 就是 exit 語句前一條語句的返回值,根據這個值可以判斷腳本成功執行與否。
$? 可以查看 最后一條命令的返回值 該變量可以在shell 腳本中的任何地方使用.
#! /bin/bash echo "please input the branch you want to compare" read $MY_BRANCH for i in $(cat list);do git-diff --quiet $MY_BRANCH $i [--quiet 選項的意思是不要輸出比較后各個diff出來的結果] if [ $? -eq 0 ] [$? 就是上一條命令執行的狀態碼] then echo $i fi done
波浪線展開
1.當他用在一個單詞的開頭,它會展開指定用戶的主目錄名
echo ~xiaohui 輸出 /home/xiaohui
2.如果沒有指定用戶名,則是當前用戶的主目錄
echo ~ 輸出 /home/mylinuxusername
算術表達式展開
echo $(($((5**2))*3)) 注意**是去冪,另外使用$需要兩層$(()) 輸出 75
花括號展開
創建多個文本字符串
echo Front-{A,B,C}-Back 輸出 Front-A-Back Front-B-Back Front-C-Back echo Number_{1..5} 輸出Number_1 Number_2 Number_3 Number_4 Number_5 echo a{A{1,2},B{3,4}}b 輸出aA1b aA2b aB3b aB4Bb
參數展開
1.展開用戶名
echo $USER 輸出mylinuxname
3、文件展開練習
mkdir -p /tmp/{a,b}{c,d}
mkdir -p /tmp/mylinux/{bin,boot/grub,dev,etc/rc.d/init.d,sysconfig/network-scripts,lib/modules,lib64,proc,sbin,sys,tmp,user/local/{bin,sbin},var/{lock,log,run}}
4、文件存儲結構
Linux正統的文件系統(如ext2、ext3)一個文件由目錄項、inode和數據塊組成。
目錄項:包括文件名和inode節點號。
Inode:又稱文件索引節點,是文件基本信息的存放地和數據塊指針存放地。
數據塊:文件的具體內容存放地。
Linux正統的文件系統(如ext2、3等)將硬盤分區時會劃分出目錄塊、inode Table區塊和data block數據區域。一個文件由一個目錄項、inode和數據區域塊組成。Inode包含文件的屬性(如讀寫屬性、owner等,以及指向數據塊的指針),數據區域塊則是文件內容。當查看某個文件時,會先從inode table中查出文件屬性及數據存放點,再從數據塊中讀取數據。
文件存儲結構大概如下:
其中目錄項的結構如下(每個文件的目錄項存儲在改文件所屬目錄的文件內容里):
其中文件的inode結構如下(inode里所包含的文件信息可以通過stat filename查看得到):
inode簡介
上面我們看到了存儲設備的宏觀結構。我們要深入到分區的結構,特別是文件在分區中的存儲方式。文件是文件系統對數據的分割單元。文件系統用目錄來組織文件,賦予文件以上下分級的結構。在硬盤上實現這一分級結構的關鍵,是使用inode來虛擬普通文件和目錄文件對象。
一個文件除了自身的數據之外,還有一個附屬信息,即文件的元數據(metadata)。這個元數據用于記錄文件的許多信息,比如文件大小,擁有人,所屬的組,修改日期等等。元數據并不包含在文件的數據中,而是由操作系統維護的。事實上,這個所謂的元數據就包含在inode中。我們可以用$ls -l filename來查看這些元數據。正如我們上面看到的,inode所占據的區域與數據塊的區域不同。每個inode有一個唯一的整數編號(inode number)表示。
在保存元數據,inode是“文件”從抽象到具體的關鍵。正如上一節中提到的,inode儲存由一些指針,這些指針指向存儲設備中的一些數據塊,文件的內容就儲存在這些數據塊中。當Linux想要打開一個文件時,只需要找到文件對應的inode,然后沿著指針,將所有的數據塊收集起來,就可以在內存中組成一個文件的數據了。
數據塊在1, 32, 0, …
inode并不是組織文件的唯一方式。最簡單的組織文件的方法,是把文件依次順序的放入存儲設備,DVD就采取了類似的方式。但果有刪除操作,刪除造成的空余空間夾雜在正常文件之間,很難利用和管理。
復雜的方式可以使用鏈表,每個數據塊都有一個指針,指向屬于同一文件的下一個數據塊。這樣的好處是可以利用零散的空余空間,壞處是對文件的操作必須按照線性方式進行。如果想隨機存取,那么必須遍歷鏈表,直到目標位置。由于這一遍歷不是在內存進行,所以速度很慢。
FAT系統是將上面鏈表的指針取出,放入到內存的一個數組中。這樣,FAT可以根據內存的索引,迅速的找到一個文件。這樣做的主要問題是,索引數組的大小與數據塊的總數相同。因此,存儲設備很大的話,這個索引數組會比較大。
inode既可以充分利用空間,在內存占據空間不與存儲設備相關,解決了上面的問題。但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的指針指像這些數據塊,并放入內存中的數據。
軟連接、硬鏈接
軟鏈接和硬鏈接是我們常見的兩種概念:
硬連接:直接指向同一個inode的不同路徑彼此之間稱為硬鏈接 是給文件一個副本,同時建立兩者之間的連接關系。修改其中一個,與其連接的文件同時被修改。如果刪除其中任意一個其余的文件將不受影響。
軟連接:也叫符號連接,他只是對源文件在新的位置建立一個“快捷(借用一下wondows常用詞)”,指向另一個路徑(是一個字符串),最終訪問文件的權限是以哪個文件權限為準,所以,當源文件刪除時,符號連接的文件將成為無源之水->僅僅剩下個文件名了,當然刪除這個連接,也不會影響到源文件,但對連接文件的使用、引用都是直接調用源文件的。
具體關系可以看下圖:
從圖上可以看出硬鏈接和軟鏈接的區別:
1:硬鏈接原文件和新文件的inode編號一致。而軟鏈接不一樣。
2:對原文件刪除,會導致軟鏈接不可用,而硬鏈接不受影響。
3:對原文件的修改,軟、硬鏈接文件內容也一樣的修改,因為都是指向同一個文件內容的。
硬鏈接:
1、只能對文件創建,不能應用于目錄
2、不能跨文件系統
3、創建硬鏈接會增加文件系統被鏈接的次數
符號鏈接:
1、可應用于目錄
2、可以跨文件系統
3、不會增加被鏈接文件的鏈接次數
4、其大小為指定的路徑所包含的字符個數
stat filename 查看時間戳
5、指令:alias
設置指令的別名
語法:# alias name='command line'
參數:
-p: 打印出現有的別名(唯一的參數)
若不加任何參數,則列出目前所有的別名設置
用法:
# alias cp='cp -i'
這樣就可以用cp來代替cp -i,而且cp -i這條命令依舊有效
查看alias:
列出目前所有的別名設置。
# alias 或 # alias -p
查看具體一條指令的別名
# alias cp
別名永久化:
alias的作用僅在該次登入的操作,即輸入一次alias后,這個修改只在當前的Shell生效。如果重新開啟一個 Shell,或者重新登錄,則這些alias將無法使用。好在linux中提供alias永久化的方法:
<1>.若要每次登入就自動生效別名,則把別名加在/etc/profile或~/.bashrc中。然后# source ~/.bashrc
<2>.若要讓每一位用戶都生效別名,則把別名加在/etc/bashrc最后面,然后# source /etc/bashrc
重新設置別名:
alias重置的方法與第一次設置的時候一樣
# alias cp='cp -i'
刪除別名:
格式:unalias name
# unalias cp
在bash腳本編寫中,我們時常需要引用變量與替換命令,為規范操作,現對其做簡單的總結說明。
引用
引用就是指將字符串用引用符號括起來,以防止特殊字符被shell腳本解釋為其他意義。引用時屏蔽特殊字符的特殊意義,而將其解釋為字面意義。
引用符、名稱、意義說明表
引用符 | 名稱 | 意義說明 |
'' | 單引號 | 稱全引用或弱引用,引用所有的字符;單引號中字符除單引號本身之外都解釋為字面意義,單引號不具備引用變量的功能。。單引號用于保持引號內所有字符的字面值,即使引號內的\和回車也不例外。 |
"" | 雙引號 | 稱部分引用或強引用,引用除美元符號($)、反引號(`)和反斜線(\)之外的所有字符。即在雙引號中保持美元符號($)、反引號(`)和反斜線(\)符號的特殊含義,如"$變量名"表示以變量值替換變量名。利用雙引號引用變量能夠防止字符串分割,保留變量中的空格。 |
“ | 反引符 | shell把反引符中的內容解釋為系統命令 |
\ | 反斜杠 | 轉意符,屏蔽下一個字符的特殊意義,Linux常用的特殊字符有$、*、`、+、^、&、|、"、? |
舉例:
# test="x y z";echo '$test'
# $test #不會轉意,單引號只把其里面的字符的字面意義直接進行輸出
# test="x y z";echo $test
# x y z #引用變量值,但不保留變量中的空格
# test="x y z";echo “$test”
# x y z #引用變量值,并保留變量中的空格
注意:一個變量的值可以作為某個長字符串中的一部分.如果它在長字符串的末尾,就可直接引用,如果在開頭或中間,應該用花括號將該變量括起來。
舉例:
# test="xyz";echo test$test
# testxyz #正常輸出
# test="xyz";echo $testtest
#不會有任何輸出,因shell會去引用變量testtest的值,可該變量并沒有定義賦值
# test="xyz";echo ${test}test
# xyztest #正常輸出
命令替換
命令替換是指將命令的標準輸出作為值賦給某個變量,bash Shell定義了兩種形式進行命令的替換,兩種形式的語法格式如下:
方式一: `Linux命令`
方式二: $(Linux命令)
舉例:
# echo `pwd`
# /tmp #引用pwd命令的執行結果并輸出
注意:盡管$()和反引號在命令替換上是等價的,但是,$()形式的命令替換是可以嵌套的。bash Shell中,反引號與$()在處理雙反斜線符號時存在區別。
#echo \\
#\ #輸出轉義符
#echo `echo \\`
# #輸出空白行
##echo $(echo \\)
#\ #輸出單斜線
6-12、正則練習
ls /var/ | egrep "^l.*[0-9]{1,}.*[a-z]$"
ls /etc/ | egrep "^[0-9]{1,}.*[^(0-9)]{1,}$"
ls /etc/ | egrep -o "^[^A-Za-z][A-Za-z].*"
touch /tmp/tfile-`date +%F-%H-%M-%S`
ls /etc/ | egrep ^p.*[^0-9]$ | xargs -i cp /etc/{} /tmp/mytest1
ls /etc/ | egrep ".*\.d$" | xargs -i cp -r /etc/{} /tmp/mytest2
ls /etc/ | egrep "^[lmn].*\.conf$" | xargs -i cp /etc/{} /tmp/mytest3
原創文章,作者:未聞花名,如若轉載,請注明出處:http://www.www58058.com/40854
命令演示最好使用代碼格式渲染一下,可以提前預習一下bash13問,更能直觀的了解bash的更多的相關特性