Linux Shell--基礎指令


Linux shell--基礎指令

瀏覽Linux文件系統

  Linux中最基礎也是最必要的一條指令

  cd destination

  cd命令可接受單個參數destination,用以指定想切換到的目錄名。如果沒有為cd命令指定目標路徑,它將切換到用戶主目錄。

  destination參數可以用兩種方式表示:一種是使用絕對文件路徑,另一種是使用相對文件路徑。

   接下來將分別闡述這兩種方法。這兩者之間的不同對於理解文件系統遍歷非常重要。

1. 絕對文件路徑

   用戶可在虛擬目錄中采用絕對文件路徑引用目錄名。絕對文件路徑定義了在虛擬目錄結構中該目錄的確切位置,以虛擬目錄的根目錄開始,相當於目錄的全名。
  絕對文件路徑總是以正斜線(/)作為起始,指明虛擬文件系統的根目錄。因此,如果要指向usr目錄所包含的bin目錄下的用戶二進制文件,可以使用如下絕對文件路徑:
  /usr/bin
  使用絕對文件路徑可以清晰表明用戶想切換到的確切位置。要用絕對文件路徑來切換到文件系統中的某個特定位置,只需在cd命令后指定全路徑名:
1 xiaoyu@ubuntu:~$ cd /usr/bin 2 xiaoyu@ubuntu:/usr/bin$ 
   注意,在上面的例子中,提示符中一開始有一個波浪號(~)。在切換到另一個目錄之后,這個波浪號被/usr/bin替代了。CLI提示符正是用它來幫助你跟蹤當前所在虛擬目錄結構中的位置。波浪號表明shell會話位於你的主目錄中。在切換出主目錄之后,如果提示符已經進行了相關配置 的話,絕對文件路徑就會顯示在提示符中。

   pwd命令

  pwd命令可以顯示出shell會話的當前目錄,這個目錄被稱作當前工作目錄。pwd命令的用法如下:

1 xiaoyu@ubuntu:/usr/bin$ pwd
2 /usr/bin 3 xiaoyu@ubuntu:/usr/bin$ 
  在切換到新的當前工作目錄時使用pwd命令,是很好的習慣。因為很多shell命令都是在當前工作目錄中操作的,在發出命令之前,你應該始終確保自己處在正確的目錄之中。

  可以使用絕對路徑文件路徑切換到Linux虛擬目錄結構中的任何一級:

1 xiaoyu@ubuntu:/$ cd sys/power 2 xiaoyu@ubuntu:/sys/power$ pwd
3 /sys/power 4 xiaoyu@ubuntu:/sys/power$ 

  但是如果只是在自己的主目錄中工作,經常使用絕對路徑的話未免太過冗長,例如,若已經位於目錄/home/xiaoyu,在輸入下方這樣的命令切換到Documents目錄就有點繁瑣了

/home/Documents

2. 相對文件路徑

   相對文件路徑允許用戶指定一個基於當前位置的目標文件路徑。相對文件路徑不以代表根目錄的正斜線(/)開頭,而是以目錄名(如果用戶准備切換到當前工作目錄下的一個目錄)或是一個特殊字符開始。假如你位於home目錄中,並希望切換到Documents子目錄,那你可以使用cd命令加上一個相對文件路徑:
1 xiaoyu@ubuntu:~$ pwd
2 /home/xiaoyu 3 xiaoyu@ubuntu:~$ cd Documents/
4 xiaoyu@ubuntu:~/Documents$ pwd
5 /home/xiaoyu/Documents 6 xiaoyu@ubuntu:~/Documents$ 
   上面的例子並沒有使用正斜線(/),而是采用了相對文件路徑將當前工作目錄從 /home/christine改為/home/christine/Documents,大大減少了輸入內容。
  另外,此例中還要注意的是,如果提示符經過配置可以顯示出當前工作目錄,它就會一直顯示波浪號。這表明當前工作目錄位於用戶home目錄之下。

  事實上,在實際工程中,使用絕對路徑跟相對路徑都沒啥講究,都會互相結合使用。

  返回上一級目錄

  返回上一級目錄,我們使用雙點符(..),表示當前目錄的父目錄

  雙點符在目錄層級中移動時非常便利。如果正處在主目錄下的Documents目錄中,需要切換到主目錄下的Downloads目錄,可以這么做:

1 xiaoyu@ubuntu:~$ cd Documents 2 xiaoyu@ubuntu:~/Documents$ pwd
3 /home/xiaoyu/Documents 4 xiaoyu@ubuntu:~/Documents$ cd ../Downloads 5 xiaoyu@ubuntu:~/Downloads$ pwd
6 /home/xiaoyu/Downloads 7 xiaoyu@ubuntu:~/Downloads$ 

 

文件和目錄列表

  要想知道系統中有哪些文件,可以使用列表命令(ls)

  基本的列表功能

  ls命令最基本的形式會顯示當前目錄下的文件和目錄:

xiaoyu@ubuntu:~$ ls Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos vmware-tools-distrib xiaoyu xiaoyu@ubuntu:~$ 

 

  ls命令輸出的列表是按字母排序的(按列排序而不是按行來排序)

  ls -F,-F參數的ls命令可以輕松區分文件和目錄

1 xiaoyu@ubuntu:~$ ls -F 2 Desktop/  Documents/  Downloads/  examples.desktop  Music/  Pictures/  Public/  Templates/  Videos/  vmware-tools-distrib/  xiaoyu/
3 xiaoyu@ubuntu:~$ 

  -F參數在目錄名后面加了正斜線(/),以方便用戶在輸出中分辨,在可執行文件的后面加個*號,嗯,我目錄中暫時沒有可執行文件,以便用戶找出可在系統中運行的文件。

  基本的ls命令在某種意義上有點容易讓人誤解。它顯示了當前目錄下的文件和目錄,但並沒有將全部都顯示出來。Linux經常采用隱藏文件來保存配置信息。在Linux上,隱藏文件通常是文件名以點號開始的文件。這些文件並沒有在默認的ls命令輸出中顯示出來,因此我們稱其為隱藏文件。要把隱藏文件和普通文件及目錄一起顯示出來,就得用到-a參數。下面是一個帶有-a參數的ls命令的例子:

1 xiaoyu@ubuntu:~$ pwd
2 /home/xiaoyu 3 xiaoyu@ubuntu:~$ ls -a 4 .              .bashrc  Desktop    examples.desktop  .local    .profile                   Videos                .xsession-errors 5 ..             .cache   .dmrc      .gconf            .mozilla  Public                     vmware-tools-distrib  .xsession-errors.old 6 .bash_history .compiz Documents .gnupg Music .sudo_as_admin_successful .Xauthority 7 .bash_logout .config Downloads .ICEauthority Pictures Templates xiaoyu 8 xiaoyu@ubuntu:~$ 
  所有以點號開頭的隱藏文件現在都顯示出來了。注意,有三個以.bash開始的文件。它們是bash shell環境所使用的隱藏文件
   -R參數是ls命令可用的另一個參數,叫作遞歸選項。它列出了當前目錄下包含的子目錄中的文件。如果目錄很多,這個輸出就會很長。以下是-R參數輸出的簡單例子:

  由於結果太長,我這里就不貼了,建議在目錄層級比較少的目錄下操作

  顯示長列表

  在基本的輸出列表中,ls命令並未輸出太多每個文件的相關信息。要顯示附加信息,另一個常用的參數是-l。-l參數會產生長列表格式的輸出,包含了目錄中每個文件的更多相關信息。

 1 xiaoyu@ubuntu:~$ ls -l  2 total 52
 3 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Desktop  4 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Documents  5 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Downloads  6 -rw-r--r-- 1 xiaoyu xiaoyu 8980 Dec  4 07:46 examples.desktop  7 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Music  8 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Pictures  9 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Public 10 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Templates 11 drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Videos 12 drwxr-xr-x 9 xiaoyu xiaoyu 4096 Feb 20  2019 vmware-tools-distrib 13 drwxrwxr-x 3 xiaoyu xiaoyu 4096 Dec 11 14:20 xiaoyu 14 xiaoyu@ubuntu:~$ 
  這種長列表格式的輸出在每一行中列出了單個文件或目錄。除了文件名,輸出中還有其他有用信息。輸出的第一行顯示了在目錄中包含的總塊數。在此之后,每一行都包含了關於文件(或目錄)的下述信息:
  •   文件類型,比如目錄(d)、文件(-)、字符型文件(c)或塊設備(b);
  •   文件的權限
  •   文件的硬鏈接總數
  •   文件屬主的用戶名
  •   文件屬組的組名
  •   文件的大小(大小以字節為單位)
  •   文件的上次修改時間
  •   文件名或目錄名

  通常我們會ls -a -l -F一起使用,當然這樣寫很復雜,可以直接這么寫ls -alF

  過濾輸出列表

  由前面的例子可知,默認情況下,ls命令會輸出目錄下的所有非隱藏文件。有時這個輸出會顯得過多,當你只需要查看單個少數文件信息時更是如此。
  幸而ls命令還支持在命令行中定義過濾器。它會用過濾器來決定應該在輸出中顯示哪些文件或目錄。
  這個過濾器就是一個進行簡單文本匹配的字符串。可以在要用的命令行參數之后添加這個過濾器:
1 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_file 2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file 3 xiaoyu@ubuntu:~/xiaoyu$ 
  當用戶指定特定文件的名稱作為過濾器時,ls命令只會顯示該文件的信息。有時你可能不知道要找的那個文件的確切名稱。ls命令能夠識別標准通配符,並在過濾器中用它們進行模式匹配:
  •   問號(?)代表一個字符:
  •   星號(*)代表零個或多個字符
1 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_f?le 2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file 4 xiaoyu@ubuntu:~/xiaoyu$ 

 

  其中,過濾器my_f?le與目錄中的兩個文件匹配,類似的,型號可匹配零個或多個字符。

1 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_*
2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file 4 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:44 my_file2 5 xiaoyu@ubuntu:~/xiaoyu$ 

 

  使用星號找到了三個名字以my開頭的文件,和問號一樣,你可以把星號放在過濾器中的任意位置

1 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_f*le 2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file 4 xiaoyu@ubuntu:~/xiaoyu$ 

 

  在過濾器中使用星號和問號被稱為文件擴展匹配(file globbing),指的是使用通配符進行模式匹配的過程。通配符正式的名稱叫作元字符通配符(metacharacter wildcards)。除了星號和問號之外,還有更多的元字符通配符可用於文件擴展匹配。可以使用中括號。
1 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_f[ai]le 2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file 4 xiaoyu@ubuntu:~/xiaoyu$ 
  在這個例子中,我們使用了中括號以及在特定位置上可能出現的兩種字符:a或i。中括號表示一個字符位置並給出多個可能的選擇。可以像上面的例子那樣將待選的字符列出來,也可以指定字符范圍,例如字母范圍[a – i]。
1 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_f[a-z]le 2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file 4 xiaoyu@ubuntu:~/xiaoyu$ 
  另外,可以使用感嘆號(!)將不需要的內容排除在外。
1 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_f[!a]le 2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file

  注意:以上的(*)(?)([aj])([a-z])(!)不僅僅是在ls中有用,在linux需要用到過濾的地方,這幾種方法都是十分常見有效的

處理文件

  創建文件

    我們總會時不時地遇到要創建空文件的情況。例如,有時應用程序希望在它們寫入數據之前,某個日志文件已經存在,這時,可以用touch命令輕松創建空文件。

1 xiaoyu@ubuntu:~/xiaoyu$ touch test_one 2 xiaoyu@ubuntu:~/xiaoyu$ ls -l test_one 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:03 test_one 4 xiaoyu@ubuntu:~/xiaoyu$ touch test_one 5 xiaoyu@ubuntu:~/xiaoyu$ ls -l test_one 6 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:04 test_one 7 xiaoyu@ubuntu:~/xiaoyu$ 

 

  touch命令創建了你指定的新文件,並將你的用戶名作為文件的屬主。注意,文件的大小是零,因為touch命令只創建了一個空文件。

  touch命令還可用來改變文件的修改時間。這個操作並不需要改變文件的內容。

  如果只想改變訪問時間,可以使用-a參數。

xiaoyu@ubuntu:~/xiaoyu$ touch -a test_one
xiaoyu@ubuntu:~/xiaoyu$ ls -l test_one
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:04 test_one
xiaoyu@ubuntu:~/xiaoyu$ ls -l --time=atime test_one
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:07 test_one
xiaoyu@ubuntu:~/xiaoyu$

 

  在上面的例子中,要注意的是,如果只使用ls –l命令,並不會顯示訪問時間。這是因為默認顯示的是修改時間。要想查看文件的訪問時間,需要加入另外一個參數:--time=atime。有了這個參數,就能夠顯示出已經更改過的文件訪問時間。
  創建空文件和更改文件時間戳算不上你在Linux系統中的日常工作。不過復制文件可是在使用shell時經常要干的活兒。

   復制文件

    對系統管理員來說,在文件系統中將文件和目錄從一個位置復制到另一個位置可謂家常便飯。cp命令可以完成這個任務。
    在最基本的用法里,cp命令需要兩個參數——源對象和目標對象:
 
     cp source destination
 
    當source和destination參數都是文件名時,cp命令將源文件復制成一個新文件,並且以destination命名。新文件就像全新的文件一樣,有新的修改時間。
xiaoyu@ubuntu:~/xiaoyu$ cp test_one test_two xiaoyu@ubuntu:~/xiaoyu$ ls -l test*
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:04 test_one -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:10 test_two xiaoyu@ubuntu:~/xiaoyu$ 
  新文件test_two和文件test_one的修改時間並不一樣。如果目標文件已經存在,cp命令可能並不會提醒這一點。最好是加上-i選項,強制shell詢問是否需要覆蓋已有文件。
1 xiaoyu@ubuntu:~/xiaoyu$ cp -i test_one test_two 2 cp: overwrite 'test_two'? y 3 xiaoyu@ubuntu:~/xiaoyu$ 

  如果不回答y,文件復制將不會繼續。也可以將文件復制到現有目錄中。

1 xiaoyu@ubuntu:~/xiaoyu$ cp -i test_one /home/xiaoyu/Documents/ 2 xiaoyu@ubuntu:~/xiaoyu$ ls -l /home/xiaoyu/Documents/
3 total 0
4 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:13 test_one 5 xiaoyu@ubuntu:~/xiaoyu$ 

 

  新文件現就在目錄Documents中了,和源文件同名。
   之前的例子在目標目錄名尾部加上了一個正斜線(/),這表明Documents是目錄而非文件。這有助於明確目的,而且在復制單個文件時非常重要。如果沒有使用正斜線,子目錄/home/christine/Documents又不存在,就會有麻煩。在這種情況下,試圖將一個文件復制到Documents子目錄反而會創建一個名為Documents的文件,連錯誤消息都不會顯示!

  上一個例子采用了絕對路徑,不過也可以使用相對路徑

1 xiaoyu@ubuntu:~/xiaoyu$ cp -i test_one ../Documents/
2 cp: overwrite '../Documents/test_one'? y 3 xiaoyu@ubuntu:~/xiaoyu$ 

 

  之前講過cd ..返回當前目錄的父目錄,單點符(.)就很適合cp命令。記住,單點符表示當前工作目錄。如果需要將一個帶有很長的源對象名的文件復制到當前工作目錄中時,單點符能夠簡化該任務

1 xiaoyu@ubuntu:~/xiaoyu$ cp /etc/NetworkManager/NetworkManager.conf . 2 xiaoyu@ubuntu:~/xiaoyu$ ls -l NetworkManager.conf 3 -rw-r--r-- 1 xiaoyu xiaoyu 76 Dec 17 15:33 NetworkManager.conf 4 xiaoyu@ubuntu:~/xiaoyu$ 

 

  制表鍵自動補全

  在使用命令行時,很容易輸錯命令,目錄名或文件名。實際上,對長目錄來說輸錯的概率還是蠻高的,按住Table鍵就可以為你自動補全命令或者目錄名了,這里就不演示了

  鏈接文件

  鏈接文件是Linux文件系統的一個優勢。如需要在系統上維護同一文件的兩份或多份副本,除了保存多份單獨的物理文件副本之外,還可以采用保存一份物理文件副本和多個虛擬副本的方法。這種虛擬的副本就稱為鏈接。鏈接是目錄中指向文件真實位置的占位符。在Linux中有兩種
  不同類型的文件鏈接:
  •   符號鏈接 
  •   硬鏈接

  符號鏈接就是實實在在的文件,它指向存放在虛擬目錄結構中某個地方的另一個文件。這兩個通過符號鏈接在一起的文件,彼此的內容並不相同。

  要為一個文件創建符號鏈接,原始文件必須事先存在。然后可以使用ln命令以及-s選項來創建符號鏈接

1 xiaoyu@ubuntu:~/xiaoyu$ touch data_file 2 xiaoyu@ubuntu:~/xiaoyu$ ls -l data_file 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:53 data_file 4 xiaoyu@ubuntu:~/xiaoyu$ ln -s data_file sl_data_file 5 xiaoyu@ubuntu:~/xiaoyu$ ls -l *data_file 6 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:53 data_file 7 lrwxrwxrwx 1 xiaoyu xiaoyu 9 Dec 17 15:53 sl_data_file -> data_file 8 xiaoyu@ubuntu:~/xiaoyu$ 

   另外還要注意的是,符號鏈接的文件大小與數據文件的文件大小。符號鏈接sl_data_file只有9個字節,而data_file有0個字節。這是因為sl_data_file僅僅只是指向data_file而已。它們的內容並不相同,是兩個完全不同的文件。

  另一種證明鏈接文件是獨立文件的方法是查看inode編號。文件或目錄的inode編號是一個用於標識的唯一數字,這個數字由內核分配給文件系統中的每一個對象。要查看文件或目錄的inode編號,可以給ls命令加入-i參數。
1 xiaoyu@ubuntu:~/xiaoyu$ ls -i *data_file 2 2752954 data_file  2752955 sl_data_file 3 xiaoyu@ubuntu:~/xiaoyu$ 

 

  從這個例子中可以看出數據文件的inode編號是2752954,而sl_data_file的inode編號則是2752955。所以說它們是不同的文件。

  硬鏈接會創建獨立的虛擬文件,其中包含了原始文件的信息及位置。但是它們從根本上而言是同一個文件。引用硬鏈接文件等同於引用了源文件。要創建硬鏈接,原始文件也必須實現存在,只不過這次使用ln命令時不再需要加入額外的參數了。

1 xiaoyu@ubuntu:~/xiaoyu$ touch code_file 2 xiaoyu@ubuntu:~/xiaoyu$ ls -l code_file 3 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 16:12 code_file 4 xiaoyu@ubuntu:~/xiaoyu$ ln code_file hl_code_file 5 xiaoyu@ubuntu:~/xiaoyu$ ls -li *code_file 6 2752979 -rw-rw-r-- 2 xiaoyu xiaoyu 0 Dec 17 16:12 code_file 7 2752979 -rw-rw-r-- 2 xiaoyu xiaoyu 0 Dec 17 16:12 hl_code_file 8 xiaoyu@ubuntu:~/xiaoyu$ 
  在上面的例子中,我們使用ls -li命令顯示了*code_files的inode編號以及長列表。注意,帶有硬鏈接的文件共享inode編號。這是因為它們終歸是同一個文件。還要注意的是,鏈接計數(列表中第三項)顯示這兩個文件都有兩個鏈接。另外,它們的文件大小也一模一樣。

  注意:只能對處於同一存儲媒體的文件創建硬鏈接。要想在不同存儲媒體的文件之間創建鏈接,只能使用符號鏈接。

   復制鏈接文件的時候一定要小心。如果使用cp命令復制一個文件,而該文件又已經被鏈接到了另一個源文件上,那么你得到的其實是源文件的一個副本。這很容易讓人犯暈。用不着復制鏈接文件,可以創建原始文件的另一個鏈接。同一個文件擁有多個鏈接,這完全沒有問題。但是,千萬別創建軟鏈接文件的軟鏈接。這會形成混亂的鏈接鏈,不僅容易斷裂,還會造成各種麻煩。
  你可能覺得符號鏈接和硬鏈接的概念不好理解。幸好下一節中的文件重命名容易明白得多。

  重命名文件

  在Linux中,重命名文件成為移動(moving)。mv命令可以將文件和目錄移動到另一個位置或重新命名
 
 1 xiaoyu@ubuntu:~/xiaoyu$ touch fall fell fill full  2 xiaoyu@ubuntu:~/xiaoyu$ ls -li f*ll  3 2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fall  4 2752955 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fell  5 2752979 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fill  6 2755050 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 full  7 
 8 
 9 xiaoyu@ubuntu:~/xiaoyu$ mv fall fzll 10 xiaoyu@ubuntu:~/xiaoyu$ ls -li f*ll 11 2752955 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fell 12 2752979 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fill 13 2755050 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 full 14 2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fzll 15 xiaoyu@ubuntu:~/xiaoyu$ 

 

  注意:移動文件會將文件名從fall更改為fzll,但inode編號和時間戳保持不變。這是因為mv只影響文件名,也可以使用mv來移動文件的位置
 1 xiaoyu@ubuntu:~/xiaoyu$ ls -li /home/xiaoyu/xiaoyu/fzll  2 2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 /home/xiaoyu/xiaoyu/fzll  3 xiaoyu@ubuntu:~/xiaoyu$ ls -li /home/xiaoyu/Pictures/
 4 total 0
 5 xiaoyu@ubuntu:~/xiaoyu$ mv fzll ../Pictures/
 6 xiaoyu@ubuntu:~/xiaoyu$ ls -li ../Pictures/
 7 total 0
 8 2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fzll  9 xiaoyu@ubuntu:~/xiaoyu$ ls -li fzll 10 ls: cannot access 'fzll': No such file or directory 11 xiaoyu@ubuntu:~/xiaoyu$ 

 

  在這個例子中,我們使用mv命令把文件fzll從/home/xiaoyu/xiaoyu/ 移動到了 /home/xiaoyu/Pictures/。和上例子一樣,這個操作沒有改變這個文件的inode號跟時間戳
  和cp命令一樣,也可以在mv命令后面加上-i參數,這樣在試圖覆蓋已有的文件時,我們就會得到提示
  唯一發生變化就是,/home/xiaoyu/xiaoyu/目錄下不再有文件fzll,因為它已經離開了原先的位置,這就是mv命令所做的事情。也可以使用mv命令移動文件位置並修改文件名稱,這些操作只需要一步就能完成。
1 xiaoyu@ubuntu:~/xiaoyu$ mv ../Pictures/fzll ./fall 2 xiaoyu@ubuntu:~/xiaoyu$ ls -li ../Pictures/fzll 3 ls: cannot access '../Pictures/fzll': No such file or directory 4 xiaoyu@ubuntu:~/xiaoyu$ ls -li ./fall 5 2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 ./fall 6 xiaoyu@ubuntu:~/xiaoyu$ 

 

  這個例子中,我們將文件fzll從子目錄Pictures中移動到了目錄/home/xiaoyu/xiaoyu/ 下,並將名字更改成了fall。文件的時間戳和inode編號都沒有改變。改變的只有位置和名稱。
  也可以使用mv命令移動整個目錄以及內容
 1 xiaoyu@ubuntu:~/my_directory$ touch 1.sh 2.sh 3.sh 4.sh
 2 xiaoyu@ubuntu:~/my_directory$ cd ..  3 xiaoyu@ubuntu:~$ ls -li my_directory/
 4 total 0
 5 2755057 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 1.sh
 6 2755059 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 2.sh
 7 2755060 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 3.sh
 8 2755061 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 4.sh
 9 xiaoyu@ubuntu:~$ mv my_directory/ new_my_directory 10 xiaoyu@ubuntu:~$ ls -li new_my_directory/
11 total 0
12 2755057 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 1.sh
13 2755059 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 2.sh
14 2755060 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 3.sh
15 2755061 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 4.sh
16 xiaoyu@ubuntu:~$ ls -li my_directory 17 ls: cannot access 'my_directory': No such file or directory 18 xiaoyu@ubuntu:~$ 

 

 
  目錄內容沒有發生變化,只有目錄名發生了變化。
  mv命令是用來移動文件!!!mv命令可能有危險的就是會刪除文件,如果你很警惕,切記加入-i參數

  刪除文件

  遲早會有要刪除文件的時候,不管時清理文件系統還是刪除某個軟件包,總要有刪除文件的時候。
  在Linux中,刪除(deleting)叫做移除(removing)。bash shell中刪除文件的命令時rm。rm命令的基本格式十分簡單。
1 xiaoyu@ubuntu:~/xiaoyu$ rm -i fall 2 rm: remove regular empty file 'fall'? y 3 xiaoyu@ubuntu:~/xiaoyu$ ls -li fall 4 ls: cannot access 'fall': No such file or directory 5 xiaoyu@ubuntu:~/xiaoyu$ 

  注意:-i參數提示你是不是要真的刪除該文件。bash shell中滅有回收站或垃圾箱,文件一旦刪除,就無法再找回。因此,在使用rm命令時,要養成總是加入-i參數的好習慣。

  也可以使用通配符刪除成組的文件。別忘了使用-i選項保護好自己的文件。

1 xiaoyu@ubuntu:~/xiaoyu$ rm -i f*ll 2 rm: remove regular empty file 'fell'? y 3 rm: remove regular empty file 'fill'? y 4 rm: remove regular empty file 'full'? y 5 xiaoyu@ubuntu:~/xiaoyu$ ls -al f*ll 6 ls: cannot access 'f*ll': No such file or directory 7 xiaoyu@ubuntu:~/xiaoyu$ 

  rm命令的另外一個特性是,如果要刪除很多文件且不受提示符的打擾,可以用-f參數強制刪除,小心為妙!

  處理目錄

  在Linux中,有些命令(比如cp命令)對文件和目錄都有效,而有些只對目錄有效。創建新目錄需要使用本節講到的一個特殊命令。刪除目錄也很有意思,本節也會講到。

  創建目錄

  在Linux中創建目錄很簡單,使用mkdir命令即可:
1 xiaoyu@ubuntu:~/xiaoyu$ mkdir one_dir 2 xiaoyu@ubuntu:~/xiaoyu$ ls -ld one_dir/
3 drwxrwxr-x 2 xiaoyu xiaoyu 4096 Dec 18 14:09 one_dir/
4 xiaoyu@ubuntu:~/xiaoyu$

 

  系統創建了一個名為one_dir的新目錄。注意,新目錄長列表是以d開頭的。這表示one_dir並不是文件,而是一個目錄 。
  可以根據需要批量地創建目錄和子目錄。但是,如果你想蛋蛋靠mkdir命令來實現,就會得到下面的錯誤消息:
1 xiaoyu@ubuntu:~/xiaoyu$ mkdir two_dir/sub_dir/under_dir 2 mkdir: cannot create directory ‘two_dir/sub_dir/under_dir’: No such file or directory 3 xiaoyu@ubuntu:~/xiaoyu$ 

  要想同時創建多個目錄和子目錄,需要加入-p參數:

 1 xiaoyu@ubuntu:~/xiaoyu$ mkdir -p two_dir/sub_dir/under_dir  2 xiaoyu@ubuntu:~/xiaoyu$ ls -R two_dir/
 3 two_dir/:  4 sub_dir  5 
 6 two_dir/sub_dir:  7 under_dir  8 
 9 two_dir/sub_dir/under_dir: 10 xiaoyu@ubuntu:~/xiaoyu$ 
mkdir參數 參數代表的意義
-m, --mode=MODE
設置文件模式(在chmod中),而不是a=rwx - umask
-p, --parents 沒有錯誤,如果存在,使父目錄需要
-v, --verbose
  • 為每個創建的目錄打印一條消息

  刪除目錄

  刪除目錄有時會顯得很棘手,shell會盡可能的防止我們捅婁子。刪除目錄的基本命令是rmdir。
1 xiaoyu@ubuntu:~/xiaoyu$ touch one_dir/my_file 2 xiaoyu@ubuntu:~/xiaoyu$ ls -li one_dir/
3 total 0
4 2755062 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 14:26 my_file 5 xiaoyu@ubuntu:~/xiaoyu$ rmdir one_dir/
6 rmdir: failed to remove 'one_dir/': Directory not empty 7 xiaoyu@ubuntu:~/xiaoyu$ 

 

  默認情況下,rmdir命令只刪除空目錄。因為我們在one_dir目錄下創建了一個文件my_file,所以rmdir拒絕刪除目錄。要解決這一問題,得先把目錄中的文件刪掉,然后才能在空目錄上使用rmdir命令。
1 xiaoyu@ubuntu:~/xiaoyu$ rm -i one_dir/my_file 2 rm: remove regular empty file 'one_dir/my_file'? y 3 xiaoyu@ubuntu:~/xiaoyu$ rmdir one_dir/
4 xiaoyu@ubuntu:~/xiaoyu$ ls -ld one_dir 5 ls: cannot access 'one_dir': No such file or directory

 

  rmdir沒有-i選項來詢問是否要刪除目錄。這也是為什么說rmdir只能刪除空目錄還是有好處的原因。
  也可以在整個非空目錄上使用rm命令。使用-r參數使得命令可以向下進入目錄(遞歸),刪除其中的文件,然后再刪除目錄本身。
1 xiaoyu@ubuntu:~/xiaoyu$ rm -ri two_dir/
2 rm: descend into directory 'two_dir/'? y 3 rm: descend into directory 'two_dir/sub_dir'? y 4 rm: remove directory 'two_dir/sub_dir/under_dir'? y 5 rm: remove directory 'two_dir/sub_dir'? y 6 rm: remove directory 'two_dir/'? y 7 xiaoyu@ubuntu:~/xiaoyu$ ls -l two_dir 8 ls: cannot access 'two_dir': No such file or directory 9 xiaoyu@ubuntu:~/xiaoyu$ 

 

  查看文件內容

    查看文件類型

    Linux中有幾個命令可以查看文件的內容,而不需要調用其它文本編輯器。
    在顯示文件內容之前,應該先了解一下文件的類型,這里不描述,自行百度去
    file命令能夠探測文件的內部,並決定文件是什么類型的:
 1 xiaoyu@ubuntu:~/xiaoyu$ ls -al .  2 total 16
 3 drwxrwxr-x  3 xiaoyu xiaoyu 4096 Dec 18 14:41 .  4 drwxr-xr-x 20 xiaoyu xiaoyu 4096 Dec 18 13:54 ..  5 drwxrwxr-x  2 xiaoyu xiaoyu 4096 Dec 18 14:41 my_dir  6 -rw-rw-r--  1 xiaoyu xiaoyu    0 Dec 18 14:39 one_file  7 -rw-rw-r--  1 xiaoyu xiaoyu   11 Dec 18 14:41 shell.sh
 8 xiaoyu@ubuntu:~/xiaoyu$ file my_dir/
 9 my_dir/: directory 10 xiaoyu@ubuntu:~/xiaoyu$ file one_file 11 one_file: empty 12 xiaoyu@ubuntu:~/xiaoyu$ file shell.sh 
13 shell.sh: ASCII text 14 xiaoyu@ubuntu:~/xiaoyu$ 

 

  查看整個文件

  如果手頭有一個很大的文本文件,你可能會想看看里面是什么內容。在Linux上有3個不同的命令可以完成這個任務。
  1. cat命令
  cat命令是顯示文本文件中所有數據的得力工具。

1 $ cat test1 2 hello 3 This is a test file. 4 That we'll use to test the cat command. 
5 $ 

  沒什么特別的,就是文本文件的內容而已。這里還有一些可以和cat命令一起用的參數,可能對你有所幫助。
  -n參數會給所有的行加上行號。

$ cat -n test1
1 hello
2
3 This is a test file.
4
5
6 That we'll use to test the cat command.
$

  這個功能在檢查腳本時很有用。如果只想給有文本的行加上行號,可以用-b參數。

$ cat -b test1 1 hello 2 This is a test file. 3 That we'll use to test the cat command. 
$ 

  最后,如果不想讓制表符出現,可以用-T參數。

1 $ cat -T test1 
2 hello 
3 This is a test file. 
4 That we'll use to^Itest the cat command. 
5 $ 

  -T參數會用^I字符組合去替換文中的所有制表符。

   對大型文件來說,cat命令有點繁瑣。文件的文本會在顯示器上一晃而過。好在有一個簡單辦法可以解決這個問題。
  
   2. more命令
   cat命令的主要缺陷是:一旦運行,你就無法控制后面的操作。為了解決這個問題,開發人員編寫了more命令。more命令會顯示文本文件的內容,但會在顯示每頁數據之后停下來。我們輸入命令more /etc/bash.bashrc生成如下圖所顯示的內容。
       


  3. less命令

  從名字上看,它並不像more命令那樣高級。但是,less命令的命名實際上是個文字游戲(從俗語“less is more”得來),它實為more命令的升級版。它提供了一些極為實用的特性,能夠實現在文本文件中前后翻動,而且還有一些高級搜索功能。less命令的操作和more命令基本一樣,一次顯示一屏的文件文本。除了支持和more命令相同的命令集,它還包括更多的選項。

  注意: 要想查看less命令所有的可用選項,可以輸入man less瀏覽對應的手冊頁。也可以這樣查看more命令選項的參考資料。

  其中一組特性就是less命令能夠識別上下鍵以及上下翻頁鍵(假設你的終端配置正確)。在查看文件內容時,這給了你全面的控制權。

  查看部分文件

  通常你要查看的數據要么在文本文件的開頭,要么在文本文件的末尾。如果這些數據是在大型文件的起始部分,那你就得等cat或more加載完整個文件之后才能看到。如果數據是在文件的末尾(比如日志文件),那可能需要翻過成千上萬行的文本才能到最后的內容。好在Linux有解決這兩個問題的專用命令。
  1. tail命令
  tail命令會顯示文件最后幾行的內容(文件的“尾部”)。默認情況下,它會顯示文件的末尾10行。
  出於演示的目的,我們創建了一個包含20行文本的文本文件。使用cat命令顯示該文件的全部內容如下:

 1 $ cat log_file  2 line1  3 line2  4 line3  5 line4  6 line5  7 Hello World - line 6 
 8 line7  9 line8 10 line9 11 line10 12 line11 13 Hello again - line 12 
14 line13 15 line14 16 line15 17 Sweet - line16 18 line17 19 line18 20 line19 21 Last line - line20 22 $

 

   現在你已經看到了整個文件,可以再看看使用tail命令瀏覽文件最后10行的效果:
 1 $ tail log_file  2 line11  3 Hello again - line 12 
 4 line13  5 line14  6 line15  7 Sweet - line16  8 line17  9 line18 10 line19 11 Last line - line20 12 $

 

   可以向tail命令中加入-n參數來修改所顯示的行數。在下面的例子中,通過加入-n 2使tail命令只顯示文件的最后兩行:
   -f參數是tail命令的一個突出特性。它允許你在其他進程使用該文件時查看文件的內容。tail命令會保持活動狀態,並不斷顯示添加到文件中的內容。這是實時監測系統日志的絕妙方式。
 
   2. head命令
   head命令,顧名思義,會顯示文件開頭那些行的內容。默認情況下,它會顯示文件前10行的文本:
 1 $ head log_file  2 line1  3 line2  4 line3  5 line4  6 line5  7 Hello World - line 6 
 8 line7  9 line8 10 line9 11 line10 12 $

   類似於tail命令,它也支持-n參數,這樣就可以指定想要顯示的內容了。這兩個命令都允許你在破折號后面輸入想要顯示的行數:

1 $ head -5 log_file 2 line1 3 line2 4 line3 5 line4 6 line5 7 $

 

   文件的開頭通常不會改變,因此head命令並像tail命令那樣支持-f參數特性。head命令是一種查看文件起始部分內容的便捷方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM