一、使用環迴文件
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視頻