文件管理
下面的命令中只列出了常用參數,並非所有,如果想了解其他參數,請使用man命令查看詳細解釋。
cat 命令
讀取文件並打印到標準輸出設備上
語法:cat [-nbs…] fileName
常用參數:
- -n 對輸出的行數進行編號
- -b 和-n相似,只不過對空白行不編號
- -s 遇到有兩行以上的空白行,就代換爲一行的空白行
示例:cat -bs /tmp/1.txt > /temp/2.txt 將1.txt 中的內容輸入到2.txt中
chattr 屬性
用於改變ext2文件系統上的文件或目錄屬性,所謂ext2文件系統就是以inode爲基礎的文件系統
語法:chattr [-RVf] [-+=AaCcDdeijsSu] [-v version] files…
常用參數:
-
-R 遞歸處理,將制定目錄下的所有文件和子目錄一併處理
-
-v<版本編號> 設置文件或目錄的版本
-
-V 顯示執行執行過程
-
+<屬性> 開啓文件或目錄的該項屬性
-
-<屬性> 關閉屬性
-
=<屬性> 制定屬性
屬性: -
A:不更新文件或目錄的最後訪問時間,這樣可以有效的降低磁盤I/O
-
a:讓文件或目錄只提供附加屬性
-
b:不更新文件或目錄的最後修改時間
-
c:將文件或目錄壓縮後存放
-
d:將文件或目錄排除在dump操作之外
-
i:不得任意改動文件或目錄
-
s:保密性刪除文件或目錄
-
S:即時更新文件或目錄
-
u:預防意外刪除
示例:使用 chattr +i /tmp/1.txt 禁止修改,我們使用vi編輯後,出現提示如下:
chgrp命令
用於變更文件或目錄的所屬組羣
語法:chgrp [-cfhRV] [所屬組羣] [文件或目錄]
常用參數:
- -v 顯示指令的執行過程
- -c 類似於 -v ,但是僅顯示更改的部分
- -h 只對符號鏈接的文件做修改,而不改動其他任何相關文件
- -R 遞歸處理,將制定目錄下的所有文件和子目錄一併處理
示例:chgrp -v guest /tmp/1.txt
chmod命令
修改文件或目錄的權限,Linux的權限分爲三級:文件的擁有者、組羣、其他,可以通過修改權限來控制文件如何被他人使用。
語法:chmod[-cfVR] [ugoa] [+-=] [rwxX…] file…
參數說明:
- -c:表示文件權限確實已經更改,才顯示器更改動作
- -v:顯示權限變更的詳細資料
- -R:遞歸變更,即對當前目錄下的所有文件及其子目錄進行相同的權限變更
- u 表示該文件的擁有者,g 表示的羣體,o 標識其他,a 標識這三者均是
-
- 表示添加權限、- 表示取消權限、= 表示設定權限
- r 表示可讀、w 表示可寫、x 表示可執行,X 表示只有當該文件是目錄或者對一些用戶已經有執行權限的時候才執行
示例:chmod u+x /tmp/2.txt
此外,還可以使用數字來表示權限,其中 r=4,w=2,x=1,rwx的屬性爲4+2+1=7,rw的屬性爲4+2=6,以此類推,比如給出所有權限 chmod 777 file。
chown 命令
修改文件的擁有者,這個命令的使用需要root權限。
語法:chown [-cfhvR] user [:group] file…
常用參數:
- -v:顯示詳細的處理信息
- -R:遞歸處理
- user:新的文件的擁有者ID
- gourp:新的文件擁有者的組別
示例:chown guest /tmp/2.txt
cksum 命令
通過檢查文件的CRC是否正確,校驗文件完整性,至少可以檢測到99.998%的已知錯誤
語法:cksum file…
示例:cksum /tmp/2.txt
如果文件內容發生了任何修改,都會改變CRC校驗碼的值。
cmp命令
用於比較兩個文件是否有差異,若兩個文件完全一樣,則不會顯示任何信息。若發現差異,則會標出第一個不同之處的字符和列數編號。
語法: cmp [-clsv][-i<字符數目>] file1 file2
參數:
- -c 除了標明差異之外,同時顯示該處對應的字符
- -i 指定字符數目
- -l 標記所有不一樣的地方
示例:cmp /tmp/1.txt /tmp/2.txt
diff命令
用於比較文件的差異,diff以逐行的方式比較文本的異同;如果指定比較目錄,diff會比較目錄中同名的同名文件,但不會比較子目錄。
語法:diff [OPTION]... FILES
擴展:Runoob上的更爲清晰https://www.runoob.com/linux/linux-comm-diff.html。
常用參數:
- -c 顯示全部內容,並標出不同
- -C<行數> 與執行 -c -<行數>指令相同
- -H 大文件時,可以加快速度
- -l<字符或字符串> 若兩個文件只是某幾行不同,而這幾行都包含了所指定的字符或字符串,則不顯示這兩個文件的差異
- -i 忽略大小寫
- -r 比較子目錄中的文件
- -w 忽略全部的空格字符
- -y 以並列的方式顯示文件的異同
- -W 配合-y使用,指定欄寬
示例:diff -y -W 50 /tmp/2.txt /tmp/3.txt
這裏的“|”表示該行的前後內容不同,“<”表示後面文件比前面文件少了1行內容,“>”表示後面文件比前面文件多了一行內容,上面的這種格式是正常格式(normal diff)輸出,最早的Unix版本用的就是這種格式。不過上個世紀80年代初,加州大學伯克利分校推出BSD版本時,覺得正常格式顯示太簡單,於是在原來的基礎上加入了上下文,也就是第二種格式,上下文格式(context diff):
前兩行顯示的是對比的文件及修改時間信息,“*1,8”表示從第一行開始連續8行,對比結果的每一行前面都有一個標記位。如果爲空標,表示該行無變化,如果爲感嘆號(!)表示該行有改動;如果爲減號(-),表示該行被刪除;如果爲加號(+),則表示該行爲新增。“----1,5---”表示第二個文件的對比,與第一個相似。但是如果2.txt和3.txt的相似度很高的話,就會顯示大量重複的內容,於是GNU diff推出了“合併格式”的diff,將2.txt和3.txt合併顯示:
變動位置用字符串“@@-1,8 +1,5@@”表示,“-1,8”表示第一個文件的第1到8行,“+1,5”表示第二個文件的1到5行,這個字符串下面就是具體的變動內容。空表示無變動,“-”表示第一個文件刪除的行,“+”標識第二個文件新增的行。不過我還是喜歡GUI比較工具,更爲直觀顯眼,Linux推薦Kompare、DiffMerge、KDiff3、TKdiff等工具。
file命令
用於辨識文件類型
語法:file [-bcLvz] [-f <文件名>] [-m<魔法數字文件>…] [文件或目錄…]
常用參數:
- -b 只列出結果,不顯示文件名
- -L 顯示鏈接文件指向文件的類比
- -f 指定名稱文件
- -z 嘗試解讀壓縮文件內容
示例:
這裏的魔法文件即Linux的magic file,指那些具有特殊文件格式的文件,比如C文件,有#include字樣;tar文件前幾個字節有特殊的規則,我們可以自己定義magic file規則判斷文件類型。
find命令
用來在指定目錄下查找文件。
語法: find path -option [-print] [-exec -ok command] {} ;
常用參數:
- -mount,-xdev:只檢索和指定目錄在同一個文件系統下的文件,避免出現其他系統中的文件
- -admin n:在過去n分鐘內被讀取過的文件
- -anewer file:比文件file更晚被讀取過的文件
- -atime,mtime,ctime n:在過去n天內被訪問、修改、最後改變的文件
- -amin,mmin,cmin n:同上,不過時間單位爲分鐘
- -empty:空的文件
- -gid n,-group :gid是n或者group名稱是
- -ipath ***,-path :路徑名稱符合的文件,ipath會忽略大小寫
- -name ***,-ipath :文件命名稱符合的文件,iname會忽略大小寫
- -type c:文件類型是c的文件,d表示目錄,c表示字型裝置文件,b表示區塊裝置文件,p表示FIFO,命名管道;f表示一般文件,l表示符號鏈接,s表示socket。
示例:
ln 命令
爲某一個文件在另外一個位置上建立一個同步的鏈接。
語法:ln [-bdfinsv] [源文件或目錄] [目標文件或目錄]
常用參數:
- -b 刪除,覆蓋以前建立的鏈接
- -f 強制執行
- -i 交互模式,文件存在則提示用戶是否覆蓋
- -n 把符號鏈接視爲一般目錄
- -s 軟連接(符號鏈接),不指定則爲硬鏈接
- -v 顯示詳細的處理過程
示例:
如圖所示,我們建立了一個軟連接“2”,指向“2.txt”,“2”的權限一列開頭爲“l”,表示這個文件爲link,如果我們修改了“2”,在“2”的末尾追加一行“g”,那麼“2.txt”中的內容也會改變。
Linux中的鏈接可以分爲兩種:硬鏈接(hard link)與軟連接(symbolic link):
硬鏈接:
之前講解過indode的相關知識,硬鏈接其實是多個文件名指向同一個索引節點(inode),其作用之一就是允許一個文件可以同時擁有多個有效路徑,這樣可以放置“誤刪”源數據,因爲在Linux的文件系統中,只要索引節點還有一個以上的鏈接,就不會釋放文件的block,這樣就可以起到保護重要文件的作用。
- 通過索引節點來進行鏈接
- 以文件副本的形式存在,不佔用實際空間
- 只能創建文件副本,無法創建目錄副本
- 必須在同一個文件系統中
軟鏈接: - 以路徑的形式存在,類似於Windows中的快捷方式
- 可以跨越文件系統
- 可以對一個不存在的文件名進行鏈接
- 對目錄和文件均可以進行鏈接
less命令
用於瀏覽文件,支持向前向後移動,這個命令在查看特別長的內容時,很高效,而且less在查看之前不會加載整個文件。
語法:less [-befgimNs] file
常用參數:
- -b<緩衝區大小> 設置緩衝區的大小
- -e 當文件結束後,自動離開
- -f 強迫打開特殊文件,如二進制文件,目錄等
- -g 只標記後面搜索的關鍵詞
- -i 搜索時忽略大小寫
- -N 顯示每行的行號
- -m 顯示百分比,類似於more
- -s 顯示連續空行爲一行
- q/Q 退出當前界面
操作:進入less的視圖界面後,我們可以使用“b”向上翻頁,“d”向下翻半頁,“u”向前滾動半頁,“y”向前滾動一行,“Space鍵”滾動一頁,“Enter鍵”滾動一行,“PgUp”上翻一頁,“PgDn”下翻一頁;若是需要搜索,可以使用“/字符串”向下搜索或“?字符串”向上搜索,配合“n”重複前一個搜索,“N”反向重複前一個搜索來操作。
示例:
如“less /temp/1.txt”,當然我們還可以對其他的輸出使用“less”命令,如“ps -ef|less”
locate命令
用於查找符合條件的文檔
語法: locate [OPTION]... PATTERN…
示例:locate 2.txt
和 find 不同的是,find 是去硬盤中查找,而locate則是建立了一個包括系統內所有檔案名稱和路徑的數據庫,搜索時在庫中查找,速度比find快,所以他需要一個庫(在/var/lib/mlocate/mlocate.db),一個配置文件(updatedb.conf),一個定時執行(crontab)。因爲locate的查找依賴於db(一般系統自己維護)查找不是實時的,所以我們可能會用到升級數據庫命令:locate -- u(注意這個命令 -- 和 u 之間有空格)。其實在我本機,由於2.txt是建立在/tmp文件夾下的,這個時候“2.txt”是搜索不到的,是什麼原因造成的呢?我們可以打開/etc/update.conf看一下:
可以看到在updatedb.conf中忽略了/tmp文件夾,所以我們在使用locate搜索時,需要清楚這一點。
which命令
用於查找環境變量$PATH設置的目錄中符合條件的文件
語法:which [文件…]
示例:which sudo
whereis命令
用於查找文件
語法: whereis [-bfmsu][-B<目錄>…][-M<目錄>…][-S<目錄>…][文件…]
常用參數:
- -b 只查找二進制文件
- -B<目錄> 只在設置的目錄下查找二進制文件
- -f 不顯示文件名前的路徑名稱
- -m 只查找說明文件
- -M<目錄> 只在設置的目錄下查找原始代碼文件
- -u 查找不包含指定類型的文件
示例:whereis nginx
這裏總結一下,Linux常見的查找命令有5個:find、locate、whereis、which、type,find最常見也最強大,基本上可以用它找到想要的任何文件;locate是基於搜索庫的查詢,速度比find快,但可能需要手動更新庫,同時他也排除掉了一些文件類型和文件夾;whereis則主要用於程序名的搜索;which則主要用於搜索系統命令;type則主要用於區分一個命令是由shell提供的,還是獨立的二進制文件提供的。
mv 命令
用來爲文件或目錄改名,或將文件或目錄移入其他位置。
語法:mv [-if] source dest,directory
常用參數:
- -i 若指定目錄已有同名文件,則先詢問是否覆蓋舊文件
- -f 若存在同名文件,不進行任何提示,直接覆蓋
示例:
mv /tmp/2.txt /tmp/22.txt
cp命令
用於複製文件或目錄
語法:cp[options] source dest 或 cp [options] source… directory
常用參數:
- -a:通常在複製目錄時使用,保留鏈接、文件屬性,並複製目錄下的所有內容,相當於dpR參數組合
- -d:複製時保留鏈接
- -f:覆蓋已經存在的目標文件而不給出提示
- -i:與-f相反,對於已存在的目標文件,需要對用戶進行問詢
- -p:除複製文件內容外,同時複製修改時間和訪問權限到目標文件中
- -r:若源文件爲目錄,複製時採用遞歸
- -I:不復制文件,只生成鏈接文件
示例: cp -r /tmp /tmp2 複製文件夾、cp /tmp/2.txt /tmp2/2_bak.txt 複製文件
rcp命令
用於複製遠程文件或目錄。
語法:rcp [-pr] [源文件或目錄..] [目標文件或目錄]
常用參數:
- -p 保留源文件或目錄的屬性,包括擁有者,所屬組羣,權限與時間
- -f 遞歸處理,將制定目錄下的文件與子目錄一起處理
示例:
rcp [email protected]:./1.txt 1.txt
由於rcp執行後並無返回信息,所以需要在目錄下查看文件是否複製成功。
scp命令
用於Linux之間複製文件和目錄,他是基於shh登錄安全的遠程文件拷貝命令,rcp是不加密的,而scp是加密的,可以視爲是rcp的安全升級版。
語法:scp [-12468Cpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
常用參數:
-
-1:強制scp命令使用協議ssh1
-
-2:強制scp命令使用協議ssh2
-
-4:強制scp命令只使用IPv4尋址
-
-6:強制scp命令只是用IPv6尋址
-
-B:使用批處理模式(傳輸過程中不詢問傳輸口令或短語)
-
-C:允許壓縮
-
-p:保留源文件的修改時間,訪問時間和訪問權限
-
-q:不顯示傳輸進度條
-
-r:遞歸賦值整個目錄
-
-v:詳細方式顯示輸出
-
-c cipher:以cipher將數據進行加密,這個選項將直接傳遞給bash
-
-F ssh_config:指定一個替代的shh配置文件,此參數直接傳遞給shh
-
-i identity_file:從指定文件中讀取傳輸時使用的密鑰文件,此參數直接傳遞給ssh
-
-l limit:限定用戶所能使用的帶寬
-
-P port:指定數據傳輸使用的端口號
示例: -
複製本地文件到遠程:scp /tmp/1.txt [email protected]:/tmp/1.txt
-
複製本地目錄到遠程:scp -r /tmp/dir/ [email protected]:/tmp/dir/
-
複製遠程文件到本地:scp [email protected]:/tmp/1.txt /tmp/1.txt
-
複製遠程目錄到本地:scp [email protected]:/tmp/dir /tmp/dir
rm命令
用於刪除一個文件或目錄。
語法:rm [-ifr] name…
常用參數:
- -i 刪除前逐一確認
- -f 即使原檔案屬性爲只讀,也直接刪除,無需逐一確認
- -r 遞歸刪除
示例:
rm 2.txt,因爲文件一旦通過rm命令刪除,則無法恢復,所以必須格外小心,大家應該都聽過“rm -rf /”這個梗,所以這個命令使用時一定要慎重。
touch命令
用於修改文件或目錄的時間屬性,包括存取時間和更改時間,若文件不存在,系統則會建立一個新文件,通常我們都是用它來新建文件,修改時間屬性倒是用的很少。
語法:touch [-acfm] [-d<日期時間>] [-r<參考文件或目錄>] [-t<日期時間>]
常用參數:
- -a 改變文件的讀取時間
- -m 改變文件的修改時間
- -c 假如目標檔案不存在,不會創建新文件
- -d 指定日期和時間
示例:touch /tmp/2.txt
awk命令
用於文本處理,它擁有強大的文本格式化能力,以空格爲默認分隔符進行切片,切開的部分再進行各種分析處理,它支持條件判斷、數組、循環等功能,我們可以把它理解爲一個腳本語言解釋器。awk是由Alfred Aho、Peter Weinberger和Brian Kernighan這三個人創造的,awk就是由三人的首字母組成,我們現在使用的awk其實是gawk,awk目前有akw、nawk和gakw三個版本,不過目前gawk最爲常用。這就是你使用man命令查詢時,爲什麼顯示的是gawk的原因了。
語法:awk [options] 'pattern+action' file…
內置定義:
- FS 保存或設置字段分隔符
- $n 指定分隔的第n個字段,如$1,$3分別表示第1列,第三列,$0表示當前讀入的整行內容
- NF 記錄當前處理行的列數
- NR 記錄當前處理行的行數
- FNR 當前行在源文件中的行號
- ~ 匹配,可以理解爲like
- !~,不匹配,可以理解爲 not like
- ==,等於 必須全部相等
- != 不等於
- && 邏輯與
- || 邏輯或
- -F[@ /t :]awk默認以空格作爲分隔符,通過-F我們可以指定@、製表符、分號等作爲分隔符
示例:
先看一個最簡單的,就是我們可以通過 awk '{print}' /tmp/3.txt 輸出文件中的內容,不過通常我們會用awk來處理一些命令輸出,例如ps -ef命令,我們只想展示第一列的話,可以使用命令如下:
不過ps的內容還是太長了,可能我們只需要看部分數據,那麼可以使用命令:
我們可以看到通過NR控制只輸出了1到10行的數據,但是我可能並不想查詢以root登錄的數據,可以使用命令:
這裏的“$1”指的是第一列,“!~”表示不包含,/root/是正則,這個時候光看用戶我們可能覺得還不夠,還想看看是哪個工作進程,順便加上漢字描述,並且把第一列全部賦值成了“其他用戶”:
作爲文本處理三劍客,grep更適合單純的查找或匹配文本,sed更適合編輯匹配到的文本,awk更適合格式化文件,對文本進行較複雜格式處理。