今天第一天寫,先說下寫shell腳本的基本知識
1. shell腳本以.sh 為擴展名,通常運行 ./${filename}.sh 或者 sh ${filename}.sh
2. shell 腳本開頭以 #!/bin/bash #!讀作 “shebang”
3. 開啟調試 #!/bin/bash –xv
4. /dev/null 任何東西丟進去都會消失,linux黑洞。 /dev/zero 用于初始化,會產生0
今天先介紹 dd 命令
由來(全稱):本來應根據其功能描述“Convert an copy”命名為“cc”,但“cc”已經被用以代表“CComplier”,所以命名為“dd”
開篇例子:
1. dd if=infile.log of=outfile.log bs=1M count=1
拷貝 infile.log內容 到 outfile.log. 一次讀寫比特數為1M , 每次讀寫一個塊(1M,由bs決定)
2. echo -n "hello world" | dd cbs=1 conv=unblock 2>/dev/null
主要演示cbs,每次轉換一個字節, conv=unblock 是將cbs 大小的塊中尾部的空格替換為一個換行符 2gt; 是錯誤信息輸出流 /dev/null 開頭介紹了
解讀help:
(不愿意看這么一大段,嘗試先跳過,看解讀)
用法:dd [操作數] ...
或:dd 選項
復制文件,依照操作數轉換并格式化。
bs=比特數 一次讀寫的比特數
cbs=比特數 一次轉換的比特數
conv=CONVS 依照每個逗號分割的標志列表轉換文件
count=塊數 只將指定個塊數復制到塊
ibs=比特數 一次讀取的比特數(默認:512)
if=文件 從指定文件中讀取
iflag=符號 按照以逗號分隔的符號列表指定的方式讀取
obs=比特數 一次寫入指定比特數(默認:512)
of=文件 寫入到指定文件
oflag=符號 按照以逗號分隔的符號列表指定的方式寫入
seek=塊數 在輸出開始處跳過指定的塊數
skip=塊數 在輸入開始處跳過指定的塊數
status=noxfer 禁止傳輸統計
塊和字節數后可能帶有以下的一個或多個后綴:
c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M
GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.
每個 CONV 符號可能為:
ascii 由EBCDIC 碼轉換至ASCII 碼
ebcdic 由ASCII 碼轉換至EBCDIC 碼
ibm 由ASCII 碼轉換至替換的EBCDIC 碼
block 將結束字符塊里的換行替換成等長的空格
unblock 將cbs 大小的塊中尾部的空格替換為一個換行符
lcase 將大寫字符轉換為小寫
ucase 將小寫字符轉換為大寫
swab 交換每一對輸入數據字節
sync 將每個輸入數據塊以NUL 字符填滿至ibs 的大?。划斉浜蟗lock
或unblock 時,會以空格代替NUL 字符填充
excl fail if the output file already exists
nocreat do not create the output file
notrunc 不截斷輸出文件
noerror 讀取數據發生錯誤后仍然繼續
fdatasync 結束前將輸出文件數據寫入磁盤
fsync 類似上面,但是元數據也一同寫入
FLAG 符號可以是:
append 追加模式(僅對輸出有意義;隱含了conv=notrunc)
direct 使用直接I/O 存取模式
directory 除非是目錄,否則 directory 失敗
dsync 使用同步I/O 存取模式
sync 與上者類似,但同時也對元數據生效
fullblock 為輸入積累完整塊(僅iflag)
nonblock 使用無阻塞I/O 存取模式
noatime 不更新存取時間
nocache 丟棄緩存數據
noctty 不根據文件指派控制終端
nofollow 不跟隨鏈接文件
解讀:
1. bs ibs obs cbs
bs: 一次 讀寫 = ibs+obs
ibs: 一次讀
obs: 一次寫
cbs: 一次轉換
2. if of
if 是讀取的文件
of 是輸出的文件
3. seek skip
skip 在從if中讀取時 跳過多少比特
seek 在寫入of時, 跳過多少比特
實戰例子:
1. 批量生成隨機名稱的測試文件
for i in {10..10}
do
dd if=/dev/zero of=junk.test$i bs="$RANDOM"K count=20
done
2. 備份和恢復
備份
dd if=abc.gz of=abc.gz.bak1 bs=1k count=10000
dd if=abc.gz of=abc.gz.bak2 bs=1k skip=10000 count=70000
dd if=abc.gz of=abc.gz.bak3 bs=1k skip=80000
恢復方法如下:
dd if=abc.gz.bak1 of=abc.gz
dd if=abc.gz.bak2 of=abc.gz bs=1k seek=10000
dd if=abc.gz.bak3 of=abc.gz bs=1k seek=80000
3. 轉換大小寫
生成大寫:dd if=dd.txt of=my.log bs=1M count=1 conv=ucase
生成小寫:為了不懶惰,留給讀者試試
4. 拷貝自己
復制代碼 代碼如下:
file_subscript=copy
dd if=$0 of=$0.$file_subscript 2>/dev/null
5.要把一張軟盤的內容拷貝到另一張軟盤上,利用/tmp作為臨時存儲區。把源盤插入驅動器中,輸入下述命令:
$ dd if =/dev/fd0 of = /tmp/tmpfile
拷貝完成后,將源盤從驅動器中取出,把目標盤插入,輸入命令:
$ dd if = /tmp/tmpfile of =/dev/fd0
軟盤拷貝完成后,應該將臨時文件刪除:
$ rm /tmp/tmpfile
6. 把net.i這個文件寫入軟盤中,并設定讀/寫緩沖區的數目。
(注意:軟盤中的內容會被完全覆蓋掉)
$ dd if = net.i of = /dev/fd0 bs = 16384
7.將文件sfile拷貝到文件 dfile中。
$ dd if=sfile of=dfile
8.創建一個100M的空文件
dd if=/dev/zero of=hello.txt bs=100M count=1
=============================================
/dev/null,外號叫無底洞,你可以向它輸出任何數據,它通吃,并且不會撐著!
/dev/zero,是一個輸入設備,你可你用它來初始化文件。
/dev/null------它是空設備,也稱為位桶(bit bucket)。任何寫入它的輸出都會被拋棄。如果不想讓消息以標準輸出顯示或寫入文件,那么可以將消息重定向到位桶。
/dev/zero------該設備無窮盡地提供0,可以使用任何你需要的數目——設備提供的要多的多。他可以用于向設備或文件寫入字符串0。
$ dd if=/dev/zero of=./test.txt bs=1k count=1
$ ls -l
total 4
-rw-r--r-- 1 oracle dba 1024 Jul 15 16:56 test.txt
eg:
$ find / -name access_log 2>/dev/null
本文出自 “書生” 博客
您可能感興趣的文章:- 一天一個shell命令 linux文本內容操作系列-awk命令詳解
- 一天一個shell命令 linux文本內容操作系列-cut命令詳解
- 使用Linux正則表達式靈活搜索文件中的文本
- 一天一個shell命令 linux文本操作系列-touch命令用法
- 一天一個shell命令 linux文本操作系列-head,tail命令詳解
- 一天一個shell命令 linux文本操作系列-diff命令詳解
- 一天一個shell命令 linux文本內容操作系列-grep命令詳解
- 一天一個shell命令 linux文本操作系列-wc命令詳解
- 詳解Linux文本文件與WIN文本文件換行格式轉換命令
- 教你一招實現Linux中的文本比對