Linux_Shell腳本學習第三章-以文件之名(下)

一、使用環迴文件

1.1 在大小爲1GB的文件中創建ext4文件系統

1.1 使用dd命令創建一個1GB大小的文件

$ dd if=/dev/zero of=loobackfile.img bs=1G count=1
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 37.3155 s, 28.8 MB/s

你會發現創建好的文件大小超過了1GB。這是因爲作爲塊設備,硬盤是按照塊大小的整數倍來分配存儲空間的。

1.2 用mkfs命令將1GB的文件格式化成ext4文件系統

$ mkfs.ext4 loopbackfile.img

1.3使用file命令檢查文件系統

$ file loobackfile.img
loobackfile.img: Linux rev 1.0 ext4 filesystem data,
UUID=c9d56c42-
f8e6-4cbd-aeab-369d5056660a (extents) (large files) (huge files)

1.4 使用mkdir創建掛載點並掛載環迴文件

# mkdir /mnt/loopback
# mount -o loop loopbackfile.img /mnt/loopback

選項-o loop用來掛載環迴文件系統。
這裏用的實際上是一種快捷方式,可以將環迴文件系統附加到(attach)由操作系統選定的設備上,這些設備的名稱類似於/dev/loop1或/dev/loop2。

1.5 也可以使用以下命令來指定具體的環回設備

# losetup /dev/loop1 loopbackfile.img
# mount /dev/loop1 /mnt/loopback

1.6 使用下面的方法進行卸載(umount)

# umount mount_point

例如:

# umount /mnt/loopback

1.7 也可以用設備文件的路徑作爲umount命令的參數

# umount /dev/loop1

1.2 在環回鏡像中創建分區

假設我們需要創建一個環迴文件,然後對其分區並掛載其中某個分區。在這種情況下,沒法使用mount - o loop。我們必須手動建立設備並掛載分區。

使用下面的方法對文件(內容全部填充爲0)進行分區:

# losetup /dev/loop1 loopback.img
# fdisk /dev/loop1

在loopback.img中創建分區並掛載第一個分區:

# losetup -o 32256 /dev/loop2 loopback.img

/dev/loop2表示第一個分區,-o用來指定偏移量,在DOS分區方案①中,這個偏移量是32256。第一個分區在硬盤上起始於32 256字節處。

1.3 使用sync立刻應用更改

對掛載設備作出的更改並不會被立即寫入物理設備。只有當內部緩衝區被寫滿之後纔會回寫設備。我們可以用sync命令強制立刻寫入更改:

$ sync

二、生成ISO及混合型ISO文件

2.1 ISO簡介

ISO鏡像是一種存檔格式,它存儲瞭如CD-ROM、DVD-ROM等光盤的精準鏡像。ISO文件通常用於存儲待刻錄的數據。

2.2 創建ISO鏡像

2.2.1 cat

# cat /dev/cdrom > image.iso

2.2.2 dd

# dd if=/dev/cdrom of=image.iso

2.2.3 mkisofs

mkisofs命令可以創建ISO鏡像文件。該命令生成的輸出文件能夠被cdrecord這類實用工具刻錄到CD-ROM或DVD-ROM。我們需要將所有文件放入同一個目錄中,然後用mkisofs命令將整個目錄中的內容寫入ISO文件:

$ mkisofs -V "Label" -o image.iso source_dir/

其中選項-o指定了ISO文件的路徑。source_dir是作爲ISO文件內容來源的目錄路徑,選項-V指定了ISO文件的卷標。

2.3 能夠啓動閃存或硬盤的混合型ISO

通常無法通過將可引導的ISO文件寫入USB存儲設備來創建可引導的U盤。但是有一種被稱爲“混合ISO”的特殊ISO文件可以實現這一點。

下面的命令能夠製作出可引導的ISO文件:

# isohybrid image.iso

將該ISO寫入USB存儲設備:

# dd if=image.iso of=/dev/sdb1

或者

# cat image.iso >> /dev/sdb1

2.3 用命令行刻錄ISO

cdrecord命令可以將ISO文件刻入CD-ROM或DVD-ROM。
使用下列命令刻錄CD-ROM:

# cdrecord -v dev=/dev/cdrom image.iso

使用-speed選項指定刻錄速度:
例如:

# cdrecord -v dev=/dev/cdrom image.iso -speed 8

參數8表明其刻錄速度爲8x。

刻錄CD-ROM時也可以採用多區段(multi-session)方式,這樣就能在一張光盤上分多次刻錄數據。多區段刻錄需要使用-multi選項:

# cdrecord -v dev=/dev/cdrom image.iso -multi

2.4 玩轉CD-ROM托盤

如果你用的是桌面電腦,。

$ eject

這個命令可以彈出光驅托盤。

$ eject -t

這個命令可以合上光驅托盤。

三、查找並修補文件差異

3.1 diff

3.1.1 生成兩個文件之間的差異對比

diff命令可以生成兩個文件之間的差異對比。
先創建下列用於演示的文件。
文件 1:version1.txt

this is the original text
line2
line3
line4
happy hacking !

文件 2:version2.txt

this is the original text
line2
line4
happy hacking !
GNU is not UNIX

非一體化(nonunified)形式的diff輸出(不使用-u選項)如下

$ diff version1.txt version2.txt
3d2
<line3
6c5
> GNU is not UNIX

一體化形式的diff輸出如下:

$ diff -u version1.txt version2.txt
--- version1.txt 2010-06-27 10:26:54.384884455 +0530
+++ version2.txt 2010-06-27 10:27:28.782140889 +0530
@@ -1,5 +1,5 @@
this is the original text
line2
-line3
line4
happy hacking !
-
+GNU is not UNIX

在一體化diff輸出中,以+起始的是新加入的行,以-起始的是被刪除的行。

修補文件可以通過將diff的輸出重定向到一個文件來生成

$ diff -u version1.txt version2.txt > version.patch

用下列命令來進行修補:

$ patch -p1 version1.txt < version.patch
patching file version1.txt

version1.txt的內容現在和version 2.txt一模一樣了。

下列命令可以撤銷作出的變更:

$ patch -p1 version1.txt < version.patch
patching file version1.txt
Reversed (or previously applied) patch detected! Assume -R? [n] y
# 變更被撤銷

如上例所示,對已修補過的文件再修補將撤銷作出的變更。如果使用patch命令的-R選項,則不會提示用戶y/n。

3.1.2 生成目錄的差異信息

diff命令也能夠以遞歸的形式處理目錄。它會對目錄中的所有內容生成差異對比。使用下面的命令:

$ diff -Naur directory1 directory2

該命令中出現的選項含義如下。
 -N:將缺失的文件視爲空文件。
 -a:將所有文件視爲文本文件。
 -u:生成一體化輸出。
 -r:遞歸遍歷目錄下的所有文件。

四、使用head 與tail打印文件的前10行和後10行

4.1 head

4.1.1 打印前10行

$ head file

4.1.2 從stdin讀取數據:

$ cat text | head

4.1.3 指定打印前幾行:

$ head -n 4 file

該命令會打印出文件的前4行。

4.1.4 打印除了最後M行之外所有的行

$ head -n -M file

注意,這裏的-M表示的是負數,並非選項。
例如,用下面的命令可以打印出除最後5行之外的所有行:

$ seq 11 | head -n -5
1
2
3
4
5
6

而下面的命令會打印出文件的第1行至第5行:

$ seq 100 | head -n 5

4.2 tail

4.2.1 打印文件的最後10行

$ tail file

4.2.2 從stdin中讀取輸入

$ cat text | tail

4.2.3 打印最後5行

$ tail -n 5 file

4.2.4 打印除了前M行之外所有的行

$ tail -n +(M+1)

例如,打印除前5行之外的所有行,M+1=6,因此使用下列命令:

$ seq 100 | tail -n +6

這條命令將打印出第6行至第100行。

4.2.5 是監視一個內容不斷增加的文件(例如系統日誌文件)中出現的新行

爲了能夠監視文件的增長,tail有一個特殊的選項-f或–follow,允許tail關注文
件內容的更新並將其顯示出來:

$ tail -f growing_file

你可能希望將該命令用於日誌文件。監視文件內容增加的命令如下:

# tail -f /var/log/messages

或者

$ dmesg | tail -f

4.2.6 tail在指定進程結束後隨之結束運行

假設進程Foo在向一個我們正在監視的文件中追加數據。那麼tail -f應該一直執行到進程Foo結束。

$ PID=$(pidof Foo)
$ tail -f file --pid $PID

當進程Foo結束之後,tail也會跟着結束。
創建一個新文件file.txt,使用你慣用的文本編輯器打開這個文件。
現在運行下列命令

$ PID=$(pidof gedit)
$ tail -f file.txt --pid $PID

向文件添加新行並不斷地保存文件。
當你更新文件時,新添加的內容都會被tail命令寫入終端。關閉文本編輯器後,tail命令也會隨之結束。

五、只列出目錄的各種方法

5.1 列出當前路徑下的目錄

5.1.1 使用ls -d

$ ls -d */

5.1.2 使用grep結合ls -F:

$ ls -F | grep "/$"

當使用ls的-F選項時,所有的輸出項後面都會多出一個代表文件類型的字符,如@、*、|等。目錄對應的是/字符。我們用grep只過濾那些行尾標記爲/$的輸出項。

5.1.3 使用grep結合ls -l:

$ ls -l | grep "^d"

ls –l輸出的每一行的首字符表示文件類型。目錄的文件類型字符是d。因此我們用grep過濾以d起始的行。^是行首標記。

5.1.4 使用find:

$ find . -type d -maxdepth 1 -print

六、在命令行中使用pushd 和popd 實現快速定位

pushd和popd可以用於在多個目錄之間切換而無需重新輸入目錄路徑。這兩個命令會創建一個路徑棧,它是一個保存了已訪問目錄的LIFO列(LastInFirstOut,後進先出)。

6.1 使用pushd和popd來代替cd命令

6.1.1 壓入並切換路徑

~ $ pushd /var/www

現在棧中包含/var/www ~,當前目錄爲 /var/www。

6.1.2 再壓入下一個目錄路徑

/var/www $ pushd /usr/src

現在棧中包含/usr/src /var/www ~,當前目錄爲/usr/src。
你可以根據需要壓入更多的目錄路徑。

6.1.3 查看棧的內容

$ dirs
/usr/src /var/www ~ /usr/share /etc
0          1               2            3       4

6.1.4 當你想切換到棧中任意一個路徑時,將每條路徑從0編號到n,然後使用你希望切換到的路徑編號

$ pushd +3

這條命令會將棧進行翻轉並切換到目錄/usr/share。
pushd總是向棧中添加路徑。如果要從棧中刪除路徑,可以使用popd。

6.1.5 刪除最近壓入的路徑並切換到下一個目錄

$ popd

假設現在棧包含/usr/src /var/www ~ /usr/share /etc,當前目錄是 /usr/src,popd會將棧更改爲/var/www ~ /usr/share /etc,然後把當前目錄切換至/var/www。

6.1.6 用popd +num可以從棧中移除特定的路徑。num是從左到右、從0到n開始計數的

6.2 cd -

假設當前路徑是 /var/www,執行下面的命令:

/var/www $ cd /usr/src
/usr/src $ # 做點什麼

現在要切換回 /var/www,不需要再輸入/var/www了,只執行:

/usr/src $ cd -

你還可以再切換到 /usr/src:

/var/www $ cd -

七、統計文件的行數、單詞數和字符數

7.1 wc

wc是一個用於統計行、單詞和字符數量的實用工具。它是Word Count(單詞計數)的縮寫。wc支持多種選項來統計行數、單詞數和字符數。

7.1.1 統計行數

$ wc -l file
$ cat file | wc -l

7.1.2 統計單詞數

$ wc -w file
$ cat file | wc -w

7.1.3 統計字符數

$ wc -c file
$ cat file | wc -c

我們可以按照下面的方法統計文本中的字符數

echo -n 1234 | wc -c
4

-n用於避免echo添加額外的換行符。

7.1.4 不使用任何選項時,wc會打印出行、單詞和字符的數量

$ wc file
1435 15763 112200

這些分別是文件的行數、單詞數和字符數。

7.1.5 使用-L選項打印出文件中最長一行的長度

$ wc file -L
205

八、打印目錄樹

8.1 tree

tree命令能夠以圖形化的樹狀結構打印文件和目錄。

8.1.1 示例

tree ~/unixfs
unixfs/
|-- bin
| |-- cat
| `-- ls
|-- etc
| `-- passwd
|-- home
| |-- pactpub
| | |-- automate.sh
| | `-- schedule
| `-- slynux
|-- opt
|-- tmp
`-- usr
8 directories, 5 files

tree命令支持多種選項。

8.1.2 -P選項可以只顯示出匹配指定模式的文件

$ tree path -P PATTERN # 使用通配符描述模式並將其放入單引號中

例如:

$ tree PATH -P ’*.sh’ # 使用目錄路徑替換PATH
|-- home
| |-- packtpub
| | `-- automate.sh

8.1.3 -I選項可以只顯示出不匹配指定模式的文件

$ tree path -I PATTERN

8.1.4 -h選項可以同時打印出文件和目錄的大小

$ tree -h

九、處理視頻與圖像文件

9.1 提取視頻中的音頻

下面的命令能夠將mp4視頻文件(FILE.mp4)中的音頻部分提取成mp3文件(OUTPUTFILE.mp3):

ffmpeg -i FILE.mp4 -acodec libmp3lame OUTPUTFILE.mp3

9.2 使用一組靜態圖像製作視頻

這個腳本可以接受一組圖片,然後從中生成一段MPEG視頻

$ cat stills2mpg.sh
echo $* | tr ' ' '\n' >files.txt
mencoder mf://@files.txt -mf fps=24 -ovc lavc \
-lavcopts vcodec=msmpeg4v2 -noskip -o movie.mpg

將上面的命令複製/粘貼到一個文件中,將文件命名爲stills2mpg.sh,設置可執行權限,然後按照下列形式調用:

./stills2mpg.sh file1.jpg file2.jpg file3.jpg ...

或者

./stills2mpg.sh *.jpg

mencoder命令要求輸入文件採用固定的格式,一行只能有一個圖像文件名。腳本的第一行將所有的命令行參數傳給tr命令,後者負責將作爲分隔符的空格轉換爲換行符。這樣就將單行文件列表變成了多行文件列表(一行一個)。

你可以通過設置FPS(frames-per-second,幀速)來改變視頻的播放速度。例如,將FPS修改成1會產生幻燈片的效果,每秒鐘播放一幀。

9.3 使用靜態照片生成平移視頻

相機拍攝的照片通常要比視頻的尺寸更大(分辨率更高)。你可以使用convert提取大尺寸照片中的某些部分,然後使用mencoder將其拼合在一起,形成平移鏡頭

$> makePan.sh
# 調用方法:
# sh makePan.sh OriginalImage.jpg prefix width height xoffset yoffset
# 清除舊數據
rm -f tmpFiles
# 創建200張靜態圖片,每次移動xoffset和yoffset個像素

for o in `seq 1 200`
do
x=$[ $o+$5 ]
convert -extract $3x$4+$x+$6 $1 $2_$x.jpg
echo $2_$x.jpg >> tmpFiles
done
#將圖片拼合成mpg視頻文件
mencoder mf://@tmpFiles -mf fps=30 -ovc lavc -lavcopts \
vcodec=msmpeg4v2 -noskip -o $2.mpg

這個腳本比我們之前見過的腳本都要複雜。它使用了7個命令行參數,分別指定了輸入圖片、輸出文件前綴、臨時圖片的寬度和高度以及原始圖片的起始偏移。
在for循環中,腳本創建了一組圖片並將其文件名保存在名爲tmpFiles的文件中。最後,使用mencoder將提取出的圖片合併成能夠導入視頻編輯器(如kdenlive或OpenShot)的MPEG視頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章