Ⅰ linux 正則表達式(1)
在Linux環境下,正則表達式主要應用於grep/egrep、sed和awk等工具,這些命令以其行處理特性為特點,針對每一行數據進行操作。基本的正則表達式包括元字元的使用,它們在文本搜索和替換中發揮關鍵作用。
1. 例如,如果你想查找以特定字元開始的文本,可以運用相應的正則模式。同樣,查找以特定字元結束的文本也有對應的正則表達式。
2. 對於空行和空格的處理,正則表達式也有解決方案,可以輕松篩選出這些內容。
3. 更具體地,如需查找"/etc/"目錄(但不包括其子目錄)下的所有文件,正則表達式能幫到你,通過精準匹配規則實現目標。
中括弧[]在正則表達式中具有特殊功能,可以實現多種模式匹配。比如:
Ⅱ Linux必須學會的60個命令:文件處理1
Linux系統信息存放在文件里,文件與普通的公務文件類似。每個文件都有自己的褲悔名字、內容、存放地址及其它一些管理信息,如文件的用戶、文戚純姿件的大小等。文件可以是一封信、一個通訊錄,或者是程序的源語句、程序的數據,甚至可以包括可執行的程序和其它非正文內容。Linux文件系統具有良好的結構,系統提供了很多文件處理程序。這里主要介紹常用的文件處理命令。
file 1.作用file通過探測文件內容判斷文件類型,使用許可權是所有用戶。
2.格式file [options]文件名3.[options]主要參數-v:在標准輸出後顯示版本信息,並且退出。
-z:探測壓縮過的文件類型。
-L:允許符合連接。
-f name:從文件namefile中讀取要分析的文件名列表。
4.簡單說明使用file命令可以知道某個文件究竟是二進制(ELF格式)的可執行文件,還是Shell Script文件,或者是其它的什麼格式。file能識別的文件類型有目錄、Shell腳本、英文文本、二進制可執行文件、C語言源文件、文本文件、DOS的可執行文件。
5.應用實例如果我們看到一個沒有後綴的文件grap,可以使用下面命令:
$ file grap grap:English text 此時系統顯示這是一個英文文本文件。需要說明的是,file命令不能探測包括圖形、音頻、視頻等多媒體文件類型。
mkdir 1.作用mkdir命令的作用是建立名稱為dirname的子目錄,與MS DOS下的md命令類似,它的使用許可權是所有用戶。
2.格式mkdir [options]目錄名3.[options]主要參數-m,--mode=模式:設定許可權<模式>,與chmod類似。
-p,--parents:需要時創建上層目錄;如果目錄早已存在,則不當作錯誤。
-v,--verbose:每次創建新目錄都顯示信息。
--version:顯示版本信息後離開。
4.應用實例在進行目錄創建時可以設置目錄的許可權,此時使用的參數是「-m」。假設要創建的目錄名是「tsk」,讓所有用戶都有rwx(即讀、寫、執行的許可權),那麼可以使用以下命令:
$ mkdir-m 777 tsk grep 1.作用grep命令可以指定文件中搜索特定的內容,並將含有這些內容的行標准輸出。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用許可權是所有用戶。
2.格式grep [options] 3.主要參數[options]主要參數:
-c:只輸出匹配行的計數。
-I:不區分大小寫(只適用於單字元)。
-h:查詢多文件時不顯示文件名。
-l:查詢多文件時只輸出包含匹配字元的文件名。
-n:顯示匹配行及行號。
-s:不顯示不存在或無高絕匹配文本的錯誤信息。
-v:顯示不包含匹配文本的所有行。
pattern正則表達式主要參數:
:忽略正則表達式中特殊字元的原有含義。
^:匹配正則表達式的開始行。
$:匹配正則表達式的結束行。
<:從匹配正則表達式的行開始。
>:到匹配正則表達式的行結束。
[ ]:單個字元,如[A]即A符合要求。
[ - ]:范圍,如[A-Z],即A、B、C一直到Z都符合要求。
。:所有的單個字元。
*:有字元,長度可以為0。
正則表達式是Linux/Unix系統中非常重要的概念。正則表達式(也稱為「regex」或「regexp」)是一個可以描述一類字元串的模式(Pattern)。如果一個字元串可以用某個正則表達式來描述,我們就說這個字元和該正則表達式匹配(Match)。這和DOS中用戶可以使用通配符「*」代表任意字元類似。在Linux系統上,正則表達式通常被用來查找文本的模式,以及對文本執行「搜索-替換」操作和其它功能。4.應用實例查詢DNS服務是日常工作之一,這意味著要維護覆蓋不同網路的大量IP地址。有時IP地址會超過2000個。如果要查看nnn.nnn網路地址,但是卻忘了第二部分中的其餘部分,只知到有兩個句點,例如nnn nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9 ]{3 }.[0-0{3}。含義是任意數字出現3次,後跟句點,接著是任意數字出現3次,後跟句點。
$grep '[0-9 ]{3 }.[0-0{3}' ipfile 補充說明,grep家族還包括fgrep和egrep。fgrep是fix grep,允許查找字元串而不是一個模式;egrep是擴展grep,支持基本及擴展的正則表達式,但不支持q模式范圍的應用及與之相對應的一些更加規范的模式。
dd 1.作用dd命令用來復制文件,並根據參數將數據轉換和格式化。
2.格式dd [options] 3.[opitions]主要參數bs=位元組:強迫ibs=<位元組>及obs=<位元組>。
cbs=位元組:每次轉換指定的<位元組>。
conv=關鍵字:根據以逗號分隔的關鍵字表示的方式來轉換文件。
count=塊數目:只復制指定<塊數目>的輸入數據。
ibs=位元組:每次讀取指定的<位元組>。
if=文件:讀取<文件>內容,而非標准輸入的數據。
obs=位元組:每次寫入指定的<位元組>。
of=文件:將數據寫入<文件>,而不在標准輸出顯示。
seek=塊數目:先略過以obs為單位的指定<塊數目>的輸出數據。
skip=塊數目:先略過以ibs為單位的指定<塊數目>的輸入數據。
4.應用實例
dd命令常常用來製作Linux啟動盤。先找一個可引導內核,令它的根設備指向正確的根分區,然後使用dd命令將其寫入軟盤:
$ rdev vmlinuz /dev/hda $dd if=vmlinuz of=/dev/fd0
上面代碼說明,使用rdev命令將可引導內核vmlinuz中的根設備指向/dev/hda,請把「hda」換成自己的根分區,接下來用dd命令將該內核寫入軟盤。
find 1.作用find命令的作用是在目錄中搜索文件,它的使用許可權是所有用戶。
2.格式find [path][options][expression] path指定目錄路徑,系統從這里開始沿著目錄樹向下查找文件。它是一個路徑列表,相互用空格分離,如果不寫path,那麼默認為當前目錄。
3.主要參數[options]參數:
-depth:使用深度級別的查找過程方式,在某層指定目錄中優先查找文件內容。
-maxdepth levels:表示至多查找到開始目錄的第level層子目錄。level是一個非負數,如果level是0的話表示僅在當前目錄中查找。
-mindepth levels:表示至少查找到開始目錄的第level層子目錄。
-mount:不在其它文件系統(如Msdos、Vfat等)的目錄和文件中查找。
-version:列印版本。
[expression]是匹配表達式,是find命令接受的表達式,find命令的所有操作都是針對表達式的。它的參數非常多,這里只介紹一些常用的參數。
—name:支持統配符*和?。
-atime n:搜索在過去n天讀取過的文件。
-ctime n:搜索在過去n天修改過的文件。
-group grpoupname:搜索所有組為grpoupname的文件。
-user用戶名:搜索所有文件屬主為用戶名(ID或名稱)的文件。
-size n:搜索文件大小是n個block的文件。
-print:輸出搜索結果,並且列印。
4.應用技巧find命令查找文件的幾種方法:
(1)根據文件名查找例如,我們想要查找一個文件名是lilo.conf的文件,可以使用如下命令:
find /-name lilo.conf find命令後的「/」表示搜索整個硬碟。
(2)快速查找文件根據文件名查找文件會遇到一個實際問題,就是要花費相當長的一段時間,特別是大型Linux文件系統和大容量硬碟文件放在很深的子目錄中時。如果我們知道了這個文件存放在某個目錄中,那麼只要在這個目錄中往下尋找就能節省很多時間。比如smb.conf文件,從它的文件後綴「.conf」可以判斷這是一個配置文件,那麼它應該在/etc目錄內,此時可以使用下面命令:
find /etc-name smb.conf 這樣,使用「快速查找文件」方式可以縮短時間。
(3)根據部分文件名查找方法有時我們知道只某個文件包含有abvd這4個字,那麼要查找系統中所有包含有這4個字元的文件可以輸入下面命令:
find /-name '*abvd*'
輸入這個命令以後,Linux系統會將在/目錄中查找所有的包含有abvd這4個字元的文件(其中*是通配符),比如abvdrmyz等符合條件的文件都能顯示出來。
(4)使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如,我們想在/etc目錄中查找大於500000位元組,並且在24小時內修改的某個文件,則可以使用-and (與)把兩個查找參數鏈接起來組合成一個混合的查找方式。
find /etc -size +500000c -and -mtime +1
mv 1.作用mv命令用來為文件或目錄改名,或者將文件由一個目錄移入另一個目錄中,它的使用許可權是所有用戶。該命令如同DOS命令中的ren和move的組合。
2.格式mv[options]源文件或目錄目標文件或目錄3.[options]主要參數-i:交互方式操作。如果mv操作將導致對已存在的目標文件的覆蓋,此時系統詢問是否重寫,要求用戶回答「y」或「n」,這樣可以避免誤覆蓋文件。
-f:禁止交互操作。mv操作要覆蓋某個已有的目標文件時不給任何指示,指定此參數後i參數將不再起作用。
4.應用實例(1)將/usr/cbu中的所有文件移到當前目錄(用「.」表示)中:
$ mv /usr/cbu/ * . (2)將文件cjh.txt重命名為wjz.txt:
$ mv cjh.txt wjz.txtls 1.作用ls命令用於顯示目錄內容,類似DOS下的dir命令,它的使用許可權是所有用戶。
2.格式ls [options][filename] 3.options主要參數-a,--all:不隱藏任何以「.」字元開始的項目。
-A,--almost-all:列出除了「.」及「..」以外的任何項目。
-b,--escape:以八進制溢出序列表示不可列印的字元。
--block-size=大小:塊以指定<大小>的位元組為單位。-B,--ignore-backups:不列出任何以~字元結束的項目。
-f:不進行排序,-aU參數生效,-lst參數失效。
-F,--classify:加上文件類型的指示符號(*/=@|其中一個)。
-g:like-l, but do not list owner。
-G,--no-group:inhibit display of group information。
-i,--inode:列出每個文件的inode號。
-I,--ignore=樣式:不印出任何符合Shell萬用字元<樣式>的項目。
-k:即--block-size=1K。
-l:使用較長格式列出信息。
-L,--dereference:當顯示符號鏈接的文件信息時,顯示符號鏈接所指示的對象,而並非符號鏈接本身的信息。
-m:所有項目以逗號分隔,並填滿整行行寬。
-n,--numeric-uid-gid:類似-l,但列出UID及GID號。
-N,--literal:列出未經處理的項目名稱,例如不特別處理控制字元。
-p,--file-type:加上文件類型的指示符號(/=@|其中一個)。
-Q,--quote-name:將項目名稱括上雙引號。
-r,--reverse:依相反次序排列。
-R,--recursive:同時列出所有子目錄層。
-s,--size:以塊大小為序。
diff 1.作用diff命令用於兩個文件之間的比較,並指出兩者的不同,它的使用許可權是所有用戶。
Ⅲ Linux基本操作10-----正則表達式與文件格式化處理
一
正則表達式
1
簡單的說正則表達式就是處理字元串的方法,它是以行為單位來進行字元串的處理行為,正則表達式通過一些特殊符號的輔助,可以讓用戶輕易的達到查找,刪除,替換某特定字元串的處理程序
2
grep在數據中查找一個字元串時,是以整行為單位來進行數據的選取的,也就是說假如一個文件內有10行,那麼其中兩行是有用的,那麼就將這兩行顯示出來,其它的丟棄
3
在bash當中,我們知道通配符*可以用來表示任意個字元,但是正則表達式中的*表示不同的含義
在正則表達式中,'.'表示的是一定有一個任意字元的意思
在正則表達式中,'*'表示的是重復前一個字元0到無窮多次的意思
4
基礎的正則表達式
RE字元
意義
^word
查找行首為word的行
word$
查找結尾為word的行
.
代表一定有一個任意的字元
*
重復前一個字元0個到無窮多個
[list]
從字元集合裡面選擇一個字元
[n1-n2]
從要選擇的范圍裡面選擇一個字元
[^list]
從不是這個字元集合裡面找出一個字元
/{n,m/}
連續n到m個的前一個字元,/{n/}則是連續n個前一個字元,/{n,/}則是聯系n到無窮多個前一個字元
二
sed
工具
1
sed本省是一個管道命令,可以分析標轉輸入,而且sed還可以將數據進行替換,刪除,新增,選取特定行等功能
2
sed的用法
sed
[-nefr]
[動作]
-n
使用安靜模式,在一般模式中,所有來自stdin的數據一般都會被列出到屏幕上,但是如果加上-n這個參數的話,則只有經過sed特殊處理的那一行才會被列出
-e
直接在命令模式上進行sed的動作編輯
-f
直接將sed的動作寫在一個文件內,-f
filename則可以執行filename內的sed動作
-r
sed的動作支持的是擴展正則表達式的語法
-i
直接修改文件的內容,而不是由屏幕輸出
3
動作說明
n1,n2
function
n1,n2不見得會存在,一般代表的是進行的動作的行數
function有下面這些參數
a:
新增,a的後面可以接字元串,而這些字元串會在新的一行出現,目前的下一行
c:
替換,c的後面可以接字元串,這些字元串可以替換n1,n2之間的行
d:
刪除,因為是刪除,所以d後面通常不接任何參數
i:
插入,i的後面可以接字元串,而這些字元串會在新的一行,目前的上一行
p:
列印,也就是將某個選擇的數據列印出來
s:
替換,可以直接進行替換的工作
三
文件的格式化以及相關處理
1
格式化列印
printf
'列印內容『
實際內容
關於C程序語言內,常見的變數格式
%ns
那個n是數字,s代表的是string
%nd
那個n是數字,d代表的是整數
%N.nf
那個n與N都是數字,f代表浮點數
2
文件比較工具diff
diff就是用在比較兩個文件之間的區別,並且是行為單位來比較的,一般是用在ASCLL純文本文件的比較上
diff的用法
diff
[-bBi]
from_file
to_file
-b
忽略一行當中僅有多個空白的區別
-B
忽略空白行的區別
-i
忽略大小寫的不同
3
如果我們要將舊的文件升級成為新的文件時,我們可以先利用diff比較出文件的區別,並將區別文件製作成為補丁文件,再由補丁文件更新舊文件即可。
一般來說我們使用diff製作出來的比較文件通常擴展名為.patch
更新:patch
-pN
<
patch_file
還原:patch
-R
-pN
<
patch_file
Ⅳ Linux 從 0 到 1(一) - 終端簡介,文件與目錄以及相關操作,常用命令
模式:
當打開終端,第一行所見的就叫命令行提示符。我的是這樣的:
命令行提示符,顧名思義就是提示在其後面輸入命令。在你輸入新的一行命令前,這個命令提示符都會出現。分別解析一下上邊代表什麼意滲絕思:
oscar 這是當前用戶的名字。Linux是一個多用戶的操作系統,Windows也可以。不過Linux的多用戶管理更方便。我們一般建議每個使用Linux系統的用戶都創建答喊缺一個屬於自己的賬戶,便於隱私管理。
@ 這個符號我們應該不陌生,我們的電子郵件一般都是 [email protected] 這樣的不是嗎。這個@就表示英語里的at,是「在...裡面,落戶在...的,在其中」的意思。@前面是用戶名,後面是所在的域。
oscar-laptop 這是當前電腦/操作系統的名字。上面說了在@後面的是一個域,所以 oscar@oscar-laptop 就表示oscar-laptop這台電腦的oscar這個用戶。oscar-laptop這個名稱在安裝此Linux系統時可以任意指定。
: 這是分隔符,沒有什麼特別的涵義。
~ 這是當前所在目錄的名字,會隨著用戶進入不同目錄而改變。~表示當前用戶的家目錄,有點類似Windows系統的「我的文檔」這個目錄。
$ 指示你所具有的許可權的字元。在Linux系統中有兩種可能:
因此, oscar@oscar-laptop:~$ 的意思就是:
你目前是以oscar這個用戶登錄;你的電腦名稱為oscar-laptop;你目前位於 ~ 目錄下,就是你的用戶家目錄。你是普通用戶,擁有有限的許可權。
參數里可以包含多個參數,由空格隔開,也可以包含數字,字母,等等。可以說,參數沒有固定的格式,但是一般來說還是遵循一定的規范的。
如果我們要一次加好幾個短參數,可以用空格隔開,例如:
多個短參數也可以合並在一起,例如上面的命令等價於:
請注意:參數的字母的大小寫是有區別的,大寫的T和小寫的t通常表示不同意思。
如果有多個長參數,是不能像多個短參數那樣合並寫的。而是只能以空格隔開,例如:
當然我們也可以組合使用短參數和長參數,例如:
有時候,同一個意義的參數有短參數和長參數兩種形式,效果是一樣的,可以任選哪一種。
有一些參數你還需要給它賦一個值才行。而且短參數和長參數的賦值的方式不盡相同。
例如,短參數賦值,通常是這樣的:
表示把10賦值給p參數。
如果是長參數,則一般是這樣賦值:
長參數的方式更加容易理解,但是不如短參數那麼簡潔。
正如我們說過的,參數的形式沒有絕對的准則。我們上面給出的規則是一般的,有些命令的參數格式可能是我們沒怎麼見過的。
有些參數就不一樣,而且取決於命令。例如對於 ls 這個命令,假如後面帶了一個參數,這個參數是一個目錄的路徑名的話,那麼就會列出此目錄下的文件。
兩種類型的文件
簡單起見,我們把Linux下的文件分為兩大類:
在一個文件系統中,我們總有一個被稱為根目錄的東西,這個根目錄里包含了所有其他目錄和文件。Linux中有且只有一個根目錄,就是
是的,就是用一個斜杠表示。沒有比根目錄再高一階的目錄了,因為沒有目錄包含根目錄,根目錄就是Linux最頂層的目錄。
Linux系統安裝後,包含了很多的文件和目錄(雖然其實都是文件),我們很容易迷失在「茫茫文海」中。
當然我們不可能一下子列出Linux中的所有文件,那不現實。但是我們可以向你展示如何在Linux的目錄樹中來回穿梭,你可以知道此刻你位於哪個目清辯錄下。就好比能看懂Linux這個很大的「地圖」。
pwd 是英語Print Working Directory的縮寫,表示「列印當前工作目錄」。
which 命令:獲取命令的可執行文件的位置,which命令用於顯示一個命令的對應的可執行程序的位置。可能聽起來有點拗口。
在Linux下,每一條命令其實對應了一個可執行程序。我們在終端中輸入命令,再按回車的時候,其實就是執行了對應的那個程序。比如說,pwd命令對應的pwd程序就是存在於Linux中的。
which命令接受一個參數,也就是你想要知道其可執行程序位於哪裡的那個命令。
我們來測試一下,就拿pwd命令來測試好了:
得到:
因此,pwd命令對應的pwd這個可執行程序位於/bin目錄中。
我們也可以注意到Linux中的可執行程序和Windows中不太一樣,在Windows中可執行程序一般以.exe結尾,而Linux中一般是沒有後綴名的。
Linux中的可執行程序也不是都位於相同目錄的。我們可以來測試一下which命令本身對應的可執行程序位於哪裡:
我們可以看到,which命令對應的可執行程序which並不位於/bin中,而是在/usr/bin中。
Ubuntu的終端默認是有顏色標注的,一般來說:
如果在你的終端里沒有標明顏色,那麼你可以加上參數 --color=auto 來開啟顏色標注。如下:
如果你不需要顏色標注,那麼可以用 --color=none 來關閉顏色標注。如下:
當然,為了避免每次都輸入這么一串額外的參數,其實我們可以在一個配置文件里修改,使得永久顯示顏色或不顯示顏色。
在Linux,以點( . )開頭的文件是隱藏文件,不過這里不包括開頭的兩個 . 和 .. ,這兩個的含義如下:
- . (一個點)表示當前目錄。在當前情況下,就是 /home/oscar 。
- .. (兩個點)表示上一級目錄。因為當前目錄是/home/oscar,所以上一級目錄就是 /home 。
我們有一個大寫的參數 -A,它的作用和小寫的-a幾乎一樣,唯一不同就是-A不列出 . 和 .. 這兩個文件。
-l 這個參數算是ls命令最常用的了。加上-l參數使得ls命令列出一個顯示文件和目錄的詳細信息的列表。
當我們僅用ls -l時,列出的文件詳細信息中,文件的大小是以位元組為單位的。有時這不是太直觀。我們可以再加一個參數-h,h是humain readable的縮寫,表示「適合人類閱讀的」。所以我們的命令變成了:
t是time的縮寫。
命令也是很有用的,因為它可以讓我們知道文件和目錄所佔的空間大小。
雖然ls -l命令也可以顯示文件和目錄的大小,但是命令統計的才是真正的文件大小。命令會深入遍歷每個目錄的子目錄,把所有文件的大小都做一個統計。
是英語disk usage的縮寫,表示「磁碟使用/佔用」。
我們的命令也可以使用參數。
cat命令和less命令:顯示文件內容,這兩個命令只能顯示文件內容,並不能對文件內容進行修改。
一次性顯示文件的所有內容,如果你想要在顯示的文件內容上加上行號,那麼你可以加上 -n 這個參數。
分頁顯示文件內容
head命令和tail命令:顯示文件的開頭和結尾。
顯示文件開頭,默認情況下,head會顯示文件的頭10行。我們也可以指定顯示的行數,用 -n 這個參數:
就會顯示文件的頭5行。
顯示文件結尾。默認情況下,tail會顯示文件的尾10行。
我們也可以指定顯示的行數,用 -n 這個參數:
就會顯示文件的尾5行。
tail命令還可以配合 -f 參數來實時追蹤文件的更新:
這樣,就會檢查文件是否有追加內容,如果有,就顯示新增內容。
默認地,tail -f會每過1秒檢查一下文件是否有新內容。你也可以指定間隔檢查的秒數,用 -s 參數:
可以用快捷鍵 Ctrl + c 來終止tail -f 命令。
touch命令和mkdir命令:創建文件和目錄
創建一個空白文件。事實上,Linux沒有一個命令是專門用來創建一個空白文件的。touch命令其實一開始的設計初衷是修改文件的時間戳,就是可以修改文件的創建時間或修改時間,讓電腦以為文件是在那個時候被修改或創建的。但是touch命令如果後面跟著的文件名是不存在的,那麼它就會新建一個。
事實上,我們可以用touch命令同時創建多個文件:
如果我所要創建的文件的名字里有空格怎麼辦呢?
很簡單,加上雙引號:
創建一個目錄。
mkdir也可以同時創建好幾個目錄:
如果我所要創建的目錄的名字里有空格怎麼辦呢?
很簡單,加上雙引號:
我們還可以用 -p 參數來遞歸創建目錄結構。
比如:
cp命令和mv命令:拷貝文件和移動文件
拷貝文件或目錄
cp是英語的縮寫,表示「拷貝」。所以,顧名思義,此命令用於拷貝。cp命令不僅可以拷貝單個文件,還可以拷貝多個文件,也可以拷貝目錄。
復制文件到另一個目錄只需要把cp命令的第二個參數換成目錄名。
拷貝目錄
要拷貝目錄,只要在cp命令之後加上-R參數(注意是大寫的R)。拷貝的時候,目錄中的所有內容(子目錄和文件)都會被拷貝。
使用通配符*
*號(星號)是很常用的正則表達式的符號,被稱為「通配符」,
所以如果我們用如下命令:
那麼就會把當前目錄下所有txt文件拷貝到folder這個子目錄當中。
又如:
那麼就會把當前目錄下凡是以ha開頭的文件都拷貝到folder目錄中。
移動文件
mv是英語move的縮寫,表示「移動」。mv命令有兩個功能:
用mv命令來移動目錄很簡單,不需要額外的參數,就跟移動文件一樣:
當然,我們也可以使用通配符。
除了移動文件,mv命令還可以用於重命名文件。
事實上,Linux中沒有一個專門的命令用於重命名文件。之所以mv命令可以重命名文件,其實還是歸因於它的機制:移動文件。經過mv移動之後,原始文件變成了新的名字的文件,文件內容是不變的,這不就相當於重命名了嗎?
以上命令會將new_file重命名為renamed_file。
刪除文件和目錄
rm命令可以刪除一個文件,多個文件,目錄,甚至你的整個Linux系統(如果你願意的話)。
以上命令刪除當前目錄下的new_file_這個文件。
我們也可以同時刪除多個文件,只要用空格隔開每個文件即可。例如:
保險起見,用rm命令刪除文件時,可以加上 -i 參數,這樣對於每一個要刪除的文件,終端都會詢問我們是否確定刪除。i是英語inform的縮寫,表示「告知,通知」。
有兩種回答:
y:是英語yes的縮寫,表示「是」。那麼回車確認後,文件就刪除了。
n:是英語no的縮寫,表示「否」。那麼回車確認後,文件不會刪除。
如果在rm命令後加上-f參數,那麼終端不會詢問用戶是否確定刪除文件,不論如何,文件會立刻被強制刪除。
f是英語force的縮寫。
以上命令會強制刪除file文件。
r是英語recursive的縮寫,表示「遞歸的」。所以使用-r參數,可以使rm命令刪除目錄,並且遞歸刪除其包含的子目錄和文件。
這個命令也挺危險的,用得不好可能你的子目錄和文件都沒了。
以上命令會刪除one這個目錄,包括其子目錄和文件。
其實,也存在一個命令
看著和 rm -r 挺像的。但是這個命令有個局限性:只能刪除空的目錄。
創建鏈接
事實上,Linux下有兩種鏈接類型:
為了區分這兩種鏈接類型的不同,我們首先來談一談如Linux這樣的操作系統中文件在硬碟上的存放。
文件在硬碟上存儲時,大致來說(請注意我用了「大致來說」),每個文件有兩部分:
文件名的列表是儲存在硬碟的其他地方的,和文件內容分開存放,這樣方便Linux管理。
注意:為什麼我上面要用「大致說來」呢?因為此處我們簡化了描述,其實每個文件有三部分:
我們這里簡化地將文件分為兩部分:文件名和文件內容。因為我們不想把事情復雜化,我們想要理解兩種鏈接類型的區別,暫時只要知道這些就夠了。
每個文件的文件內容被分配到一個標示號碼,就是inode。因此每個文件名都綁定到它的文件內容(用inode標識)。原理如下圖:
下面我們學習如何創建硬鏈接和軟連接。
比之軟鏈接,硬鏈接的使用幾率小很多。但是我們還是要學習一下,畢竟可能會用到。
硬鏈接的原理:使鏈接的兩個文件共享同樣的文件內容,也就是同樣的inode。
所以一旦文件1和文件2之間有了硬鏈接,那麼你修改文件1或文件2,其實修改的是相同的一塊內容。只不過我們可以用兩個文件名來取到文件內容。
硬鏈接有一個缺陷:只能創建指向文件的硬鏈接,不能創建指向目錄的硬鏈接。但是軟鏈接可以指向文件或目錄。當然了,事實上,通過一些參數的修改,也可以創建指向目錄的硬鏈接,但是比較復雜,這里不再詳述。所以對於目錄的鏈接,我們一般都是用軟鏈接。
硬鏈接原理圖:
要創建硬鏈接,直接用ln命令,不加任何參數:
我們可以用ls -i命令查看一下(-i參數可以顯示文件的inode)。對於硬鏈接來說,刪除任意一方的文件,共同指向的文件內容並不會從硬碟上被刪除。
我們用ls -l命令查看文件信息的時候,第二列的那個2,其實是表示擁有相同inode號的文件數。不難理解,因為它們指向相同的文件內容,所以共享一個inode。
這個第二列的數字,一般來說對於普通文件,都是1,因為不同文件inode不同嘛。對於目錄來說,這第二列的數字標明目錄內所含文件數目。
其實,軟鏈接才是真正像我們在Windows下的快捷方式的,其原理很相似。
創建硬鏈接是ln不帶任何參數,但是要創建軟鏈接需要加上-s參數。s是symbolic(符號的)的縮寫。
file2指向的不再是file1的文件內容(和硬鏈接不同),而是指向file1的文件名。
軟鏈接原理圖:
用ls -l命令查看一下,會發現形式和之前的硬鏈接不一樣噢,file2的信息是這樣的: file2->file1,表示file2指向file1。
而且file2前面的許可權那裡的第一個字母變成了l,表示link(鏈接)。之前硬鏈接的時候是沒有l的,硬鏈接外表看起來就和普通文件類似。
我們用ls -l命令查看文件信息的時候,第二列的那個1,表示擁有相同inode號的文件數。不難理解,因為file2指向file1,它們並沒有指向同一塊文件內容,所以它們的inode號不相同。
軟鏈接的特點:
Ⅳ 求批量正則表達式修改文件名的命令。windows/linux都OK
forfnamein`ls`
do
newname=`echo$fname|sed's/999/001/;s/html$/png/'`
echo$newname
mv$fname$newname
done
Ⅵ linux下開發腳本搜索子目錄批量更改文件名
前言
本文主要給大家介紹了關於Linux shell用sed批量更改文件名的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
示例
去除特定字元
目標:將 2017-01-01.jpg、2018-01-01.jpg 改為 20170101.jpg、20180101.jpg
方法:將所有 - 替換為空
for file in `ls | grep .jpg`
do
newfile=`echo $file | sed 's/-//g'`
mv $file $newfile
done
這里使用sed進行標准輸出的字元串替換,其通用格式如下:
stdout | sed 's/pattern/replace/'
上述示例中,在末尾添加g用於替換所有匹配項,而不僅僅替換第一個匹配項。
中間插入字元
目標:將 book01.txt、paper02.txt 改為 book-01.txt、paper-02.txt
方法:用分組匹配分別獲取待插入位置兩側的字元串,再通過反向引用實現替換
for file in `ls | grep .txt`
do
newfile=`echo $file | sed 's/\([a-z]\+\)\([0-9]\+\)/\1-\2/'`
mv $file $newfile
done
分析
上述示例首先通過 ls 和 grep 命令得到待改名的文件列表,然後用 sed 命令進行字元串的替換,最後再使用 mv 命令來完成文件名的更改。
獲取待改名文件列表的方法有很多,可以通過 find 命令,也可以直接給出字元串,我們將在下文中提到。
注意 for 循環後面的 ls | grep .txt,這條命令用兩個反單引號括了起來,與 $(ls | grep .txt) 的作用相同,被包圍的字元串會被當作命令執行,然後返回字元串結果。
文件名包含空格的解決方法
我們可以直接將文件列表寫到 for 循環中,而不是通過命令來得到,例如:
for file in "file1 file2 file3"
do
...
done
可以看到 for 循環是通過空格來分割字元串,因此如果待更改的文件名中包含空格的話,就會被拆分成多個文件名,從而出錯。
要解決這個問題,我們可以將 IFS(內部欄位分隔符)設置為換行符 \n,這樣一來,for 循環就會按行來獲取變數的值,確保每次獲取的確實是一個完整的文件名。
設置 IFS 變數的命令需要放在 for 循環之前:
IFS=$'\n'
for file in `ls`
do
...
done
也可以直接使用 while read 命令一次讀取一行到變數 file 中:
ls | grep "*.txt" | while read file
do
...
done
使用 find 獲取文件列表
之前的示例中,我們是通過 ls 命令來獲取文件列表。該命令只能獲取某個目錄的文件,而且沒法進行多種條件的篩選。
而一說到文件的查找,不得不提到功能強大的 find 命令。該命令可以在多個層次的目錄中查找文件,並能夠設定諸如創建時間、文件大小、所有者等多種條件,查找起文件來特別方便靈活。
用 find 命令來獲取文件列表,再用 sed 命令配合正則表達式來修改文件名,這兩個命令的結合幾乎能完成所有常見的批量改名任務。
例如,將所有大於1M,且後綴為txt或jpg的文件,由形如 book_20170101.txt、image_20170101.jpg 的文件改名為 20170101-book.txt、20170101-image.jpg,代碼如下:
for file in `find . -size +1M -name "*_*.txt" -o -name "*_*.jpg"`
do
newfile=`echo $file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./'`
mv $file $newfile
done
Ⅶ Linux如何使用正則表達式命令文本文件操作命令
Linux對文本操作命令及正則表達式:
cat
cat 是 concatenate 的縮寫,所以它的作用其實是連接文件。但默認情況下它會將連接文件的結果送到標准輸出。所以我們常用來顯示文件內容。類似於 dos 中的 type。
more
當一個文件的內容超過一屏後,我們可以用 more 這個指令來逐屏 察看 文件內容。
less
less 在 more 的基礎上,更可以逐行 察看 ,前後翻頁。
head
head 顯示文件開頭部分內容,默認顯示前十行參數 --lines 或者 –n 指明顯示行數基本格式:
tail
tail 顯示文件結尾部分內容,命令用法同 head,參數 -f 顯示文件的紀實更新,用於監視日誌文件
tail 默認顯示文件列表中每個文件的後 10 行,如果沒有文件名或文件名為「-」則其從標准輸入中讀取文件,如果有多個文件則其會在文件前面加上「==>文件名<==」以便區別。
# tail /etc/mail/sendmail.mc 默認查看文件的後 10 行內容
# tail –n 20 /etc/passwd 查看文件後 20 行內容
注意: # tail –f /var/log/message 實時監控日誌文件更新信息,非常重要
diff
diff 用於比較兩個文件之間的區別,並送到標准輸出。輸出時先報告兩個文件的哪一行不同。基本格式:
參數:
uniq 用於去除文本中相鄰的重復行。
-u 參數可以只顯示那些沒有被重復過的行。 -d 顯示有被重復過的行。
cut
cut 可以根據一個指定的標記(默認是 tab)來為文本劃分列,然後將此列顯示。使用許可權:所有使用者
基本格式: cut -cnum1 -num2 filename
說明:顯示每行從開頭算起 num1 到 num2 的文字。
[root@uplooking root] $ cut –f1 –d: /etc/shadow 表示以 : 為分隔符,顯示 /etc/shadow 的第一列 sort
sort 用來按各種需要重新排列文本,一般運用在一個管道之後。例如:
默認情況下 sort 按照字母順序排列文本。
wc
wc 用來統計一個文件的行數、詞數、字數並送到標准輸出。也可以用-l(行數)、-w(詞數)、-c(字數)來指定輸出內容。