Linux shell 学习笔记(1)— 文件和目录(查看、创建、复制、软硬链接、重命名及删除操作)
1. 啟動 shell
/etc/passwd 文件包含了所有系統用戶賬戶列表以及每個用戶的基本配置信息:
christine:x:501:501:Christine Bresnahan:/home/christine:/bin/bash
其中 /bin/bash 該字段指定了用戶使用的 shell 程序。在前面的 /etc/passwd 樣例條目中,用戶 christine 使用 /bin/bash 作為自己的默認 shell 程序。這意味著當 christine 登錄 Linux 系統后,bash shell會自動啟動。
man 命令:
當使用 man 命令查看命令手冊頁的時候,這些手冊頁是由分頁程序(pager)來顯示的。可以通過點擊空格鍵進行翻頁,或是使用回車鍵逐行查看。另外還可以使用箭頭鍵向前向后滾動手冊頁的內容,可以點擊q鍵退出。
大多數命令都可以接受 -help 或 --help 選項。
2. 文件系統
Linux 使用正斜線(/)而不是反斜線(\)在文件路徑中劃分目錄。在 Linux 中,反斜線用來標識轉義字符。
-
絕對文件路徑
絕對文件路徑總是以正斜線(/)作為起始,指明虛擬文件系統的根目錄。
-
相對文件路徑
相對文件路徑允許用戶指定一個基于當前位置的目標文件路徑。相對文件路徑不以代表根目
錄的正斜線(/)開頭,而是以目錄名(如果用戶準備切換到當前工作目錄下的一個目錄)或是一個特殊字符開始。
有兩個特殊字符可用于相對文件路徑中:
- 單點符(.),表示當前目錄;
- 雙點符(…),表示當前目錄的父目錄;
3. 文件和目錄列表
ls 命令輸出的列表是按字母排序的(按列排序而不是按行排序)
帶 -F 參數的 ls 命令輕松區分文件和目錄
$ ls -F
Desktop/ Downloads/ Music/ Pictures/ Templates/ Videos/
Documents/ examples.desktop my_script* Public/ test_file
$
-F 參數在目錄名后加了正斜線(/),在可執行文件(比如上面的my_script文件)的后面加個星號。在Linux上,隱藏文件通常是文件名以點號開始的文件,-a 參數可將其顯示出來。
-R 參數是 ls 命令可用的另一個參數,叫作遞歸選項。它列出了當前目錄下包含的子目錄中的文件。
-l 參數會產生長列表格式的輸出,默認顯示的是文件修改時間
$ ls -l
total 48
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Desktop
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Documents
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Downloads
-rw-r--r-- 1 christine christine 8980 Apr 22 13:36 examples.desktop
...
每一行都包含了關于文件(或目錄)的下述信息:
? 文件類型,比如目錄(d)、文件(-)、字符型文件(c)或塊設備(b);
? 文件的權限;
? 文件的硬鏈接總數;
? 文件屬主的用戶名;
? 文件屬組的組名;
? 文件的大小(以字節為單位);
? 文件的上次修改時間;
? 文件名或目錄名。
當用戶指定特定文件的名稱作為過濾器時,ls 命令只會顯示該文件的信息。
$ ls -l my_script
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
ls 命令能夠識別標準通配符,并在過濾器中用它們進行模式匹配:
- 問號(?)代表一個字符;
- 星號(*)代表零個或多個字符;
- 中括號([ ])表示一個字符位置并給出多個可能的選擇;
- 感嘆號 (!) 表示將將不需要的內容排除在外;
$ ls -l my_s*t
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
$ ls -l my_scr[ai]pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
$ ls -l f[a-i]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fall
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
$
$ ls -l f[!a]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
-rw-rw-r-- 1 christine christine 0 May 21 13:44 full
$
4. 處理文件
4.1 創建文件
touch filename
touch 命令創建了你指定的新文件,并將你的用戶名作為文件的屬主。注意,文件的大小是零,因為touch命令只創建了一個空文件。
4.2 復制文件
cp source destination
當 source 和 destination 參數都是文件名時,cp 命令將源文件復制成一個新文件,并且以destination 命名。新文件就像全新的文件一樣,有新的修改時間。destination 可以為目錄。
cp 命令的 -R 參數威力強大。可以用它在一條命令中遞歸地復制整個目錄的內容。
$ ls -Fd *ScriptsScripts/$ ls -l Scripts/total 25-rwxrw-r-- 1 christine christine 929 Apr 2 08:23 file_mod.sh-rwxrw-r-- 1 christine christine 254 Jan 2 14:18 SGID_search.sh-rwxrw-r-- 1 christine christine 243 Jan 2 13:42 SUID_search.sh$$ cp -R Scripts/ Mod_Scripts$ ls -Fd *ScriptsMod_Scripts/ Scripts/$ ls -l Mod_Scriptstotal 25-rwxrw-r-- 1 christine christine 929 May 21 16:16 file_mod.sh-rwxrw-r-- 1 christine christine 254 May 21 16:16 SGID_search.sh-rwxrw-r-- 1 christine christine 243 May 21 16:16 SUID_search.sh$
在執行 cp –R 命令之前,目錄 Mod_Scripts 并不存在。它是隨著 cp –R 命令被創建的,整個Scripts 目錄中的內容都被復制到其中。注意,在新的 Mod_Scripts 目錄中,所有的文件都有對應的新日期。Mod_Scripts 目錄現在已經成為了 Scripts 目錄的完整副本。
ls -d 只列出目錄本身的信息,不列出其中的內容。
$ ls -Fd public/
public//$ ls -F public/
2018/ baidusitemap.xml css/ index.html search.xml
archives/ categories/ favicon.ico js/ sitemap.xml
atom.xml CNAME fonts/ page/ tags/
4.3 鏈接文件
如需要在系統上維護同一文件的兩份或多份副本,除了保存多份單獨的物理文件副本之外,還可以采用保存一份物理文件副本和多個虛擬副本的方法。這種虛擬的副本就稱為鏈接。鏈接是目錄中指向文件真實位置的占位符。
在Linux中有兩種不同類型的文件鏈接:
-
符號鏈接-軟鏈接
符號鏈接就是一個實實在在的文件,它指向存放在虛擬目錄結構中某個地方的另一個文件。這兩個通過符號鏈接在一起的文件,彼此的內容并不相同。
要為一個文件創建符號鏈接,原始文件必須事先存在。然后可以使用ln命令以及**-s選項**來創建符號鏈接。
$ ls -l data_file -rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file $ $ ln -s data_file sl_data_file $ $ ls -l *data_file -rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file lrwxrwxrwx 1 christine christine 9 May 21 17:29 sl_data_file -> data_file $在上面的例子中,注意符號鏈接的名字sl_data_file位于ln命令中的第二個參數位置上。顯示在長列表中符號文件名后的->符號表明該文件是鏈接到文件data_file上的一個符號鏈接。
符號鏈接sl_data_file只有9個字節,而data_file有1092個字節。這是因為sl_data_file僅僅只是指向data_file而已。它們的內容并不相同,是兩個完全不同的文件。
另一種證明鏈接文件是獨立文件的方法是查看 inode 編號。文件或目錄的inode編號是一個用于標識的唯一數字,這個數字由內核分配給文件系統中的每一個對象。要查看文件或目錄的inode編號,可以給ls命令加入-i參數。
$ ls -i *data_file 296890 data_file 296891 sl_data_file $?
-
硬鏈接
硬鏈接會創建獨立的虛擬文件,其中包含了原始文件的信息及位置。但是它們從根本上而言是同一個文件。引用硬鏈接文件等同于引用了源文件。要創建硬鏈接,原始文件也必須事先存在,只不過這次使用 ln 命令時不再需要加入額外的參數了。
$ ls -l code_file -rw-rw-r-- 1 christine christine 189 May 21 17:56 code_file $ $ ln code_file hl_code_file $ $ ls -li *code_file 296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 code_file 296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 hl_code_file $帶有硬鏈接的文件共享inode編號。這是因為它們終歸是同一個文件。還要注意的是,鏈接計數(列表中第三項)顯示這兩個文件都有兩個鏈接。另外,它們的文件大小也一模一樣。
4.4 重命名文件
在Linux中,重命名文件稱為移動(moving),mv命令可以將文件和目錄移動到另一個位置或重新命名。
a. 可以使用mv來移動文件的位置;
b. 可以使用mv命令移動文件位置并修改文件名稱;
c. 可以使用mv命令移動整個目錄及其內容;
在使用 mv 的過程中,文件的時間戳和inode編號都沒有改變。改變的只有位置和名稱。
?
4.5 刪除文件
bash shell中刪除文件的命令是rm,-i命令參數提示你是不是要真的刪除該文件。bash shell中沒有回收站或垃圾箱,文件一旦刪除,就無法再找回。
$ rm -i fall
rm: remove regular empty file 'fall'? y
$
?
rm命令的另外一個特性是,如果要刪除很多文件且不受提示符的打擾,可以用**-f參數強制刪除。**
5. 處理目錄
5.1 創建目錄
在Linux中創建目錄很簡單,用mkdir命令即可
要想同時創建多個目錄和子目錄,需要加入-p參數:
$ mkdir -p New_Dir/Sub_Dir/Under_Dir
$
$ ls -R New_Dir
New_Dir:
Sub_Dir
New_Dir/Sub_Dir:
Under_Dir
New_Dir/Sub_Dir/Under_Dir:
$
?
5.2 刪除目錄
默認情況下,rmdir命令只刪除空目錄,要刪除含有整個文件的目錄,可以使用:
a、可以在整個非空目錄上使用rm命令。使用**-r選項**使得命令可以向下進入目錄,刪除其中的文件,然后再刪除目錄本身。
b、一口氣刪除目錄及其所有內容的終極大法就是使用帶有-r參數和-f參數的rm命令
6. 查看文件
6.1 查看文件類型
file命令能夠探測文件的內部,并決定文件是什么類型
$ file my_file
my_file: ASCII text
file命令不僅能確定文件中包含的文本信息,還能確定該文本文件的字符編碼,ASCII。
$ file New_Dir
New_Dir: directory
可以使用file命令作為另一種區分目錄的方法
$ file sl_data_file
sl_data_file: symbolic link to 'data_file'
file命令甚至能夠告訴你它鏈接到了哪個文件上
$ file my_script
my_script: Bourne-Again shell script, ASCII text executable
file命令對腳本文件的返回結果。盡管這個文件是ASCII text,但因為它是一個腳本文件,所以可以在系統上執行(運行)
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.24,
[...]
file命令能夠確定該程序編譯時所面向的平臺以及需要何種類型的庫。
6.2 查看整個文件
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.
more 命令
more命令會顯示文本文件的內容,但會在顯示每頁數據之后停下來。可以通過按空格鍵或回車鍵以逐行向前的方式瀏覽文本文件。瀏覽完之后,按q鍵退出。
less 命令
less命令的操作和more命令基本一樣,一次顯示一屏的文件文本。除了支持和more命令相同的命令集,它還包括更多的選項。其中一組特性就是less命令能夠識別上下鍵以及上下翻頁鍵(假設你的終端配置正確)。
6.3 查看部分文件
tail 命令
tail命令會顯示文件最后幾行的內容(文件的“尾部”)。默認情況下,它會顯示文件的末尾10行。可以向tail命令中加入**-n參數來修改所顯示的行數**。
$ tail -n 2 log_file
line19
Last line - line20
?
-f參數是tail命令的一個突出特性。它允許你在其他進程使用該文件時查看文件的內容。tail命令會保持活動狀態,并不斷顯示添加到文件中的內容。
head 命令
head命令,會顯示文件開頭那些行的內容。默認情況下,它會顯示文件前10行的文本:
它也支持-n參數,這樣就可以指定想要顯示的內容了。這兩個命令都允許你在破折號后面輸入想要顯示的行數(即不需要 輸入 -n 參數)
$ head -5 log_file
line1
line2
line3
line4
line5
?
總結
以上是生活随笔為你收集整理的Linux shell 学习笔记(1)— 文件和目录(查看、创建、复制、软硬链接、重命名及删除操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 类—类属性(私有属性、公有
- 下一篇: Linux shell 学习笔记(2)—