馬哥教育網絡班22期第二周課程練習1-未聞花名

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中查出文件屬性及數據存放點,再從數據塊中讀取數據。

文件存儲結構大概如下:

馬哥教育網絡班22期第二周課程練習1-未聞花名

其中目錄項的結構如下(每個文件的目錄項存儲在改文件所屬目錄的文件內容里):


馬哥教育網絡班22期第二周課程練習1-未聞花名

其中文件的inode結構如下(inode里所包含的文件信息可以通過stat filename查看得到):

馬哥教育網絡班22期第二周課程練習1-未聞花名

inode簡介

上面我們看到了存儲設備的宏觀結構。我們要深入到分區的結構,特別是文件在分區中的存儲方式。文件是文件系統對數據的分割單元。文件系統用目錄來組織文件,賦予文件以上下分級的結構。在硬盤上實現這一分級結構的關鍵,是使用inode來虛擬普通文件和目錄文件對象。

一個文件除了自身的數據之外,還有一個附屬信息,即文件的元數據(metadata)。這個元數據用于記錄文件的許多信息,比如文件大小,擁有人,所屬的組,修改日期等等。元數據并不包含在文件的數據中,而是由操作系統維護的。事實上,這個所謂的元數據就包含在inode中。我們可以用$ls -l filename來查看這些元數據。正如我們上面看到的,inode所占據的區域與數據塊的區域不同。每個inode有一個唯一的整數編號(inode number)表示。

在保存元數據,inode是“文件”從抽象到具體的關鍵。正如上一節中提到的,inode儲存由一些指針,這些指針指向存儲設備中的一些數據塊,文件的內容就儲存在這些數據塊中。當Linux想要打開一個文件時,只需要找到文件對應的inode,然后沿著指針,將所有的數據塊收集起來,就可以在內存中組成一個文件的數據了。

馬哥教育網絡班22期第二周課程練習1-未聞花名

                                     數據塊在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編號。

馬哥教育網絡班22期第二周課程練習1-未聞花名  馬哥教育網絡班22期第二周課程練習1-未聞花名

            在存儲設備中實際上存儲為右圖

當我們讀取一個文件時,實際上是在目錄中找到了這個文件的inode編號,然后根據inode的指針,把數據塊組合起來,放入內存供進一步的處理。當我們寫入一個文件時,是分配一個空白inode給該文件,將其inode編號記入該文件所屬的目錄,然后選取空白的數據塊,讓inode的指針指像這些數據塊,并放入內存中的數據。

軟連接、硬鏈接

軟鏈接和硬鏈接是我們常見的兩種概念:

硬連接:直接指向同一個inode的不同路徑彼此之間稱為硬鏈接 是給文件一個副本,同時建立兩者之間的連接關系。修改其中一個,與其連接的文件同時被修改。如果刪除其中任意一個其余的文件將不受影響。

軟連接:也叫符號連接,他只是對源文件在新的位置建立一個“快捷(借用一下wondows常用詞)”,指向另一個路徑(是一個字符串),最終訪問文件的權限是以哪個文件權限為準,所以,當源文件刪除時,符號連接的文件將成為無源之水->僅僅剩下個文件名了,當然刪除這個連接,也不會影響到源文件,但對連接文件的使用、引用都是直接調用源文件的。

具體關系可以看下圖:

馬哥教育網絡班22期第二周課程練習1-未聞花名

從圖上可以看出硬鏈接和軟鏈接的區別:

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

(0)
未聞花名未聞花名
上一篇 2016-08-29
下一篇 2016-08-29

相關推薦

  • DNS資源記錄類型

      資源記錄   資源記錄(Resource Records),簡稱RRs。是指每個域所包含的與之相關的資源。例如,每個RR都包括這個域的所屬(RR是從哪個域名中得到的),類型(什么樣的資源存在于這個RR中),TTL(time to live,存活時間)等等。 DNS包括七大資源記錄 A記錄:也稱為主機記錄,是DNS名稱到IP地址的映射,用于正向解…

    Linux干貨 2017-02-08
  • 馬哥教育網絡班20期 第9周課程練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash #the purpose of program : # #08/11/2016  PATH=/bin:/sbin:…

    Linux干貨 2016-08-15
  • N22-妙手-第八周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。     網橋:         一種網絡設備,負責網絡橋接,將網絡的多個網段在數據鏈路層連接起來。     集線器: &…

    Linux干貨 2016-11-07
  • 初識正則表達式

    正則表達式是個什么東東? 正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)。在很多文本編輯器里、命令中,通常要使用檢索、替換、放行和拒絕那些符合某個模式的文本。而正則表達式就是用于描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。  摘自《正則表達式之…

    Linux干貨 2015-03-27
  • python面向對象魔術方法

    python面向對象魔術方法

    Linux干貨 2017-11-20
  • 【26期】Linux第九周學習小總結

    本周帶來的是慢慢的技術分享,有關于計劃任務的分享,涉及的知識點主要是at和cron,crontab的詳解,計劃任務可以將任何腳本、程序或文檔安排在某個最方便的時間運行,有利于我們的自動化運維,當某項任務多次重復,或者某個指定的時間點多次執行時,就可以使用計劃任務方便我們的工作。

    2017-09-09

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-29 22:30

    命令演示最好使用代碼格式渲染一下,可以提前預習一下bash13問,更能直觀的了解bash的更多的相關特性

欧美性久久久久