溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

UNIX命令行慣用語有哪些

發(fā)布時(shí)間:2021-10-11 14:18:37 來源:億速云 閱讀:95 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章給大家分享的是有關(guān)UNIX命令行慣用語有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

開始學(xué)習(xí)之旅

在以前的對話 UNIX 專欄中曾多次介紹了 find 命令,這是一種非常有用的實(shí)用工具,可用于掃描并處理各種文件,甚至整個(gè) UNIX 文件系統(tǒng)。例如,我經(jīng)常將 find 與 grep 或者 Perl 一起使用,以便對大量的文件進(jìn)行處理。您需要了解在一大段代碼中的何處定義了變量或常量嗎?可以嘗試下面的命令:

代碼如下:


$ find /path/to/src  -type f | xargs grep -H -I -i -n string

該命令的輸出是一個(gè)文件名列表,其中包含 string,包括行編號和匹配的特定文本。在每個(gè)匹配的文件名和行編號的前面分別加上了 -H 和 -n 選項(xiàng)。-i 選項(xiàng)忽略大小寫。-I(大寫“I”)跳過二進(jìn)制文件。

您以前可能沒有見過 xargs,它將使用列出的所有選項(xiàng)運(yùn)行您所指定的命令,在本示例中是 grep,每次使用通過標(biāo)準(zhǔn)輸入提供的一個(gè)參數(shù)。假設(shè) /path/to/src 目錄包含文件 a、b 和 c,使用 find 與 xargs 等價(jià)于:

代碼如下:


grep -H -I -i -n string a
grep -H -I -i -n string b
grep -H -I -i -n string c

事實(shí)上,搜索文件集是一項(xiàng)常見的工作,所以 grep 具有相應(yīng)的選項(xiàng)以遞歸遍歷整個(gè)文件系統(tǒng)層次結(jié)構(gòu)??梢允褂?-d recurse 或其同義詞 -R 或者 -r。例如,可以使用:

代碼如下:


$ grep -H -I -i -n -R string/path/to/src

這個(gè)命令與 find/xargs 完成相同的任務(wù)。(您將發(fā)現(xiàn),許多與文件相關(guān)的 UNIX 實(shí)用工具都具有遞歸選項(xiàng)。ls -R 可以遞歸地列出層次結(jié)構(gòu)中的內(nèi)容。chmod、chgrp 和 chown 使用 -R 可以遞歸地將模式、組和所有權(quán)變更應(yīng)用到整個(gè)文件系統(tǒng)層次結(jié)構(gòu)。在使用 chmod -R 時(shí),請多加小心。如果刪除了目錄的執(zhí)行位,比如 chmod -R a-x,您可能會(huì)使得一個(gè)目錄變得不可使用。為了更具選擇性,可以使用 find . -type f | xargs chmod a-x。)

那么,什么時(shí)候應(yīng)該使用 find/xargs,什么時(shí)候應(yīng)該使用 grep 呢?當(dāng)需要具有一定的選擇性時(shí),可以使用 find。find 命令具有許多選項(xiàng),使得您可以選擇滿足特定要求的文件,如“所有在午夜后修改過的、并由 Joe 擁有的常規(guī)文件”。否則,使用 grep -R 就可以了。

另一種實(shí)用工具可能比 find 使用起來更加方便,并且速度更快。如果您打算根據(jù)名稱來查找一個(gè)文件,那么可以嘗試使用 locate 來代替 find -name。locate 命令周期性地(大約每天一次,由系統(tǒng)管理員設(shè)置)為系統(tǒng)中所有的文件編制目錄,并構(gòu)建一個(gè)由路徑和文件名組成的數(shù)據(jù)庫。當(dāng)您運(yùn)行 locate 時(shí),它將掃描其私有的數(shù)據(jù)庫,嘗試進(jìn)行匹配。

例如,運(yùn)行查詢 locate '*.1',將得到名稱以 .1 結(jié)尾的所有文件和目錄。(前面的星號表示匹配任何字符串。)為了方便起見,運(yùn)行 locate fish 命令與運(yùn)行 locate '*fish*' 是相同的。

貨幣替換

有許多 UNIX 實(shí)用工具可以對文件進(jìn)行修改。在大多數(shù)情況下,可以將經(jīng)過修改的內(nèi)容發(fā)送到標(biāo)準(zhǔn)輸出,您可以使用重定向操作符對其進(jìn)行進(jìn)一步的處理(使用管道“|”)或捕獲其中的結(jié)果(使用 > 或 >> 操作符)。

其他的實(shí)用工具(那些通常可以一次處理許多文件的工具)可以出于安全考慮而保留原始文件,并為修改后的內(nèi)容生成一個(gè)新的文件。例如,您可以直接在命令行中使用 Perl 對文件進(jìn)行處理。以下命令:

代碼如下:


$ perl -i.bak -pe 's/\bdollar(s?)/buck\1/g' file.txt

將“dollar”替換為“buck”,將“dollars”替換為“bucks”。perl -i 命令在原地對 file.txt 進(jìn)行修改,而 perl -i.bak 則為原始文件建立一個(gè)副本,并在其名稱后面添加 .bak,以區(qū)別于新的、經(jīng)過修改的版本。因此,如下的命令:

代碼如下:


perl -i.bak -pe 's/\bdollar(s?)/buck\1/g' *

將為當(dāng)前目錄中每個(gè)文件創(chuàng)建一個(gè)備份。假設(shè)有文件 file1.txt、file2.txt 和 file3.txt,那么您將得到 file1.txt.bak、file2.txt.bak 和 file3.txt.bak。錯(cuò)誤操作時(shí)常發(fā)生,所以建立備份是明智之舉。

如果出現(xiàn)了錯(cuò)誤,并且必須恢復(fù)原始文件,您只需輸入:

代碼如下:


mv file1.txt.bak file1.txt

。但是,如果有數(shù)百個(gè)文件 需要進(jìn)行重命名,那又應(yīng)該怎么辦呢?當(dāng)然,您并不希望輸入數(shù)百個(gè)單獨(dú)的 mv 命令。相反,您可以輸入下面的命令:

代碼如下:


foreach file in (*.txt)
do
 mv $file.bak $file
done

它適用于一些簡單的情況,如本示例中的情況。然而,這類任務(wù)非常常見,可以使用另一種特殊的實(shí)用工具,它能夠更快速地完成這項(xiàng)任務(wù)。以下命令:

代碼如下:


$ rename 's/\.bak$//' *.bak

執(zhí)行了相同的任務(wù)。正則表達(dá)式 s/\.bak$// 將命令行中列出的每個(gè)文件名后面的 .bak 刪去,在本示例中是 * 或所有文件,并使用縮短后的名稱作為目標(biāo)文件名。

當(dāng)文件名沒有什么規(guī)律時(shí),rename 命令尤其有用。例如,可以考慮下面這個(gè)目錄中的內(nèi)容,它看起來像一個(gè)大學(xué)一年級新生的信件集合。

代碼如下:


$ ls
RenT.txt  bEErMoNey.txt  gASmoNey.TXt

上面的 foreach 腳本無法處理這個(gè)問題,因?yàn)檫@些文件名毫無規(guī)律可循。而 rename 可以輕松地對其進(jìn)行處理:

代碼如下:


$ rename 'y/A-Z/a-z/' *

正則表達(dá)式 y/A-Z/a-z/ 中的 y 操作符用于進(jìn)行轉(zhuǎn)換。轉(zhuǎn)換工作需要兩個(gè)列表:一個(gè)原始字符列表和一個(gè)替換字符列表。如果這兩個(gè)列表大小相同,那么在這段文本中,將原始列表中第一個(gè)字符的實(shí)例替換為替換列表中的第一個(gè)字符。換句話說,在本示例中,每個(gè)大寫“A”的實(shí)例都將替換為小寫“a”、“B”替換為“b”,依此類推。文本中的小寫字母保持不變。

如果您需要先對 rename 所執(zhí)行的工作進(jìn)行預(yù)覽,那么可以添加 -n 選項(xiàng)。這個(gè)選項(xiàng)可以顯示該命令所執(zhí)行的工作,但并不真正地進(jìn)行這些更改:

代碼如下:


$ rename -n 'y/A-Z/a-z/' *
RenT.txt renamed as rent.txt
bEErMoNey.txt renamed as beermoney.txt
gASmoNey.TXt renamed as gasmoney.txt
$ rename 'y/A-Z/a-z/' *
$ ls
beermoney.txt  gasmoney.txt  rent.txt

其中有一個(gè)缺點(diǎn)需要避免:在 UNIX 系統(tǒng)中,文件名是區(qū)分大小寫的。一個(gè)目錄中可能包含 Aa.Txt 和 aA.txT。如上所述,可以編寫一條重命名規(guī)則將區(qū)分大小寫的文件名轉(zhuǎn)換為小寫文件名,這樣可能會(huì)與以前已存在的唯一的文件名發(fā)生沖突。在這種情況下,rename 將如何操作呢?讓我們來看一下:

代碼如下:


$ rename -n 'y/A-Z/a-z/' *
Aa.Txt renamed as aa.txt
aA.txT renamed as aa.txt
$ rename 'y/A-Z/a-z/' *
aA.txT not renamed: aa.txt already exists
$ ls
aA.txT  aa.txt

如果您希望在進(jìn)行重命名的過程中刪除現(xiàn)有的文件,那么可以添加 -f 標(biāo)志。在這個(gè)示例中,將得到一個(gè)名為 aa.txt 的文件。那么哪個(gè)文件是其原始文件呢?因?yàn)?rename 按照字母順序進(jìn)行處理,后面的 aA.txT 文件是現(xiàn)在的 aa.txt。為什么要使用 -f 呢?如果兩個(gè)文件是相同的,僅僅是名稱不同,rename -f 會(huì)刪除重復(fù)的文件。

不要?jiǎng)h除重復(fù)的文件

文件管理是使用 UNIX 系統(tǒng)時(shí)非常重要的工作。系統(tǒng)中包含大量的配置文件。您可能擁有非常多的數(shù)據(jù)文件和個(gè)人文件。您可能不時(shí)地需要?jiǎng)h除或覆蓋某個(gè)有價(jià)值的文件。Shell 和一些文件管理實(shí)用工具可以幫助您避免災(zāi)難。

在 Shell 提示符處輸入下面的命令。這些命令可以在 bash 中執(zhí)行,但 zsh 和其他 Shell 也具有類似的選項(xiàng)。

代碼如下:


$ alias mv=mv -i
$ alias rm=rm -i
$ set -o noclobber

前兩個(gè)命令分別在命令行中將 mv 替換為 mv -i、將 rm 替換為 rm -i。交互式的模式強(qiáng)制您對操作進(jìn)行確認(rèn)。

第三個(gè)命令在 Shell 中提供了一定的安全性。啟用了 noclobber 之后,您就不會(huì)一不小心使用 > 重定向操作符覆蓋某個(gè)文件:

代碼如下:


$ ls
secret.txt
$ cat > secret.txt
bash: secret.txt: cannot overwrite existing file

要禁用 noclobber,可以輸入:

代碼如下:


set +o noclobber

。您還可以在任何時(shí)候使用 >|(一個(gè)小于號加上一個(gè)豎線)重定向操作符強(qiáng)制進(jìn)行覆蓋。

代碼如下:


$ cat secret.txt
I love green eggs and ham.
$ echo "No more secrets" >| secret.txt
$ cat secret.txt
No more secrets

關(guān)于本地的一些秘密

如果您真的希望發(fā)現(xiàn)一個(gè)城市,那么您得到當(dāng)?shù)氐墓娋壅勚幾咴L一下。下面是一些命令行的組合,相當(dāng)于提供旅游資訊的 Zagat。

mkdir -p 可以快速地創(chuàng)建層次結(jié)構(gòu)。使用 -p 選項(xiàng)后,mkdir 將為指定路徑創(chuàng)建所有的目錄和子目錄:

代碼如下:


$ mkdir -p make/many/directories/at/once
$ ls -R
./make:
many</p> <p>./make/many:
directories</p> <p>./make/many/directories:
at</p> <p>./make/many/directories/at:
once</p> <p>./make/many/directories/at/once:

如果您需要了解下一個(gè)發(fā)薪日的時(shí)間,只需要輸入 cal。不帶任何參數(shù)時(shí),cal 將顯示當(dāng)前月份的日歷。cal -3 命令顯示上個(gè)月、這個(gè)月和下個(gè)月的日歷,而 cal 06 2009 將顯示 2009 年 6 月的日歷。(我的生日是那一年的某個(gè)星期一?。?/p>

代碼如下:


$ cal</p> <p>   November 2006    
Su Mo Tu We Th Fr Sa
         1  2  3  4
5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
$ cal 06 2009</p> <p>     June 2009      
Su Mo Tu We Th Fr Sa
   1  2  3  4  5  6
7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

因?yàn)?UNIX 具有許多命令,所以不太可能記住所有實(shí)用工具的所有選項(xiàng)。事實(shí)上,有時(shí)候甚至記不住實(shí)用工具的名稱。

在遇到困難時(shí),可以求助于 man。例如,要查看如何使用 man 本身,可以輸入 man man。使用 man rm 和 man mv,您還可以查看有關(guān) rm 和 mv 的解釋。并且,如果清楚需要查找的主題,那么您可以使用 man -k 查找與該主題相關(guān)的 man 頁面列表。

代碼如下:


$ man -k cron
cron (8)             - daemon to execute scheduled commands (Vixie Cron)
crontab (1)          - maintain crontab files for individual users (V3)
crontab (5)          - tables for driving cron
dh_installcron (1)   - install cron scripts into etc/cron.*

在本示例中,man 找出了一些實(shí)用工具的 man 頁面,其中有一行描述內(nèi)容中包含單詞 cron。這些 man 頁面中可能解釋了如何使用 cron,這是一個(gè)負(fù)責(zé)系統(tǒng)任務(wù)調(diào)度的守護(hù)進(jìn)程。

那么其中的數(shù)值代表什么含義呢?每個(gè)數(shù)值表示聯(lián)機(jī) UNIX 手冊中的一個(gè)部分。第 1 部分保留用于 UNIX 用戶可以在 Shell 中運(yùn)行的所有命令。第 5 部分描述了一些文件格式。第 8 部分對系統(tǒng)管理命令進(jìn)行了編目。其他的部分描述了系統(tǒng)調(diào)用 (2)、庫調(diào)用 (3),等等。

正如您所看到的,大多數(shù)命令都會(huì)產(chǎn)生某類輸出。大多數(shù)命令行命令使用標(biāo)準(zhǔn)輸出來顯示結(jié)果。但其他的一些命令則使用標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,并按順序顯示處理過程和錯(cuò)誤消息。如果您希望忽略這類輸出(這是非常有價(jià)值的,因?yàn)樗ǔ?梢愿深A(yù)命令行中執(zhí)行的操作),那么可以將輸出重定向到 UNIX bit bucket,/dev/null。這些位只能進(jìn),不能出。

下面是一個(gè)簡單的示例:

代碼如下:


$ ls
secret.txt
$ cat secret.txt
I am the Walrus.
$ cat secret.txt > /dev/null
$ cat socrates.txt > /dev/null
cat: socrates.txt: No such file or directory
$ cat socrates.txt >& /dev/null
$ echo Done.
Done.

如果將 cat 的標(biāo)準(zhǔn)輸出重定向到 /dev/null,那么將不會(huì)顯示任何內(nèi)容,因?yàn)橐褜⑺械奈话l(fā)送到了虛擬的“永久豎向文件”。然而,如果出現(xiàn)了錯(cuò)誤,將顯示發(fā)送到標(biāo)準(zhǔn)錯(cuò)誤的錯(cuò)誤消息。如果您希望忽略所有的輸出,可以使用 >& 操作符以便將 stdout 和 stderr 丟棄。

您還可以將 /dev/null 作為一個(gè)長度為零的文件,以清空現(xiàn)有的文件或者創(chuàng)建新的空白文件:

代碼如下:


$ cat secret.txt
Anakin Skywalker is Darth Vader.
$ cp /dev/null secret.txt
$ cat secret.txt
$ echo "The moon is made of cheese!" > secret.txt
$ cat secret.txt
The moon is made of cheese!
$ cat /dev/null > secret.txt
$ cat secret.txt
$ cp /dev/null newsecret.txt
$ cat newsecret.txt
$ echo Done.

Done.順便提一下,如果您在 Macintosh 中使用 UNIX,那么可以在一個(gè)終端窗口中嘗試 open 命令。例如,如果當(dāng)前工作目錄中有一個(gè)名為 poodle.jpg 的文件,命令 open poodle.jpg 將啟動(dòng) Preview 并打開 poodle.jpg,Preview 是 Mac OS X 中內(nèi)置的圖像查看器。Mac OS X open 是命令行和 Macintosh 的窗口環(huán)境之間的紐帶,并且它比借助于 Finder 要快得多。

感謝各位的閱讀!關(guān)于“UNIX命令行慣用語有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI