文件讀寫測試,磁盤讀寫測試全靠它
- 2019 年 11 月 28 日
- 筆記
來源:公眾號【編程珠璣】
作者:守望先生
ID:shouwangxiansheng
有時候需要測試磁盤讀寫速度,或者臨時讀寫文件,不想臨時寫代碼?有沒有測試使用的命令?當然有!
dd命令
dd命令可以用於文件的拷貝或者內容轉換。常見操作選項如下:
- bs=BYTES 一次讀寫位元組數
- ibs=BYTES 一次讀的位元組數
- obs=BYTES 一次寫的位元組數
- cbs=BYTES 一次轉換的位元組數
- count=N 讀寫次數
- of=FILE 將內容寫到FILE,默認寫入標準輸出
- if=FILE 從FILE中讀取,默認從標準輸入讀取
- conv=CONVS 轉換標誌
更多選項可查看man手冊。
來看一些實例。
將文件的內容進行大小寫轉換
加入文件test.txt中有以下內容:
shouwangxiansheng
現在要將內容轉換為大寫:
$ dd if=test.txt of=utest.txt conv=ucase 0+1 records in 0+1 records out 18 bytes copied, 0.0123523 s, 1.5 kB/s
執行完成後,再看看utest.txt中的內容:
SHOUWANGXIANSHEN
看到沒,已經將所有內容轉換為大寫了。
當然要達到這個目的有很多方法,比如要將test.txt內容的小寫都轉為大寫,並且保存在utest.txt中。
$ cat test.txt | tr 'a-z' 'A-Z' > utest.txt
解釋一下,conv=ucase,表示轉換操作是轉換為大寫,你還可以使用:
- lcase 轉換為小寫
- ucase 轉換為大寫
- swab 相鄰位元組交換
拷貝文件
例如將test.txt文件內容拷貝到test0.txt文件,每次拷貝1024位元組:
$ dd if=test.txt of=test0.txt bs=1024
讀取指定次數:
$ dd if=a of=b bs=1024 count=10 #讀取10次
跳過指定塊大小開始讀取: 假設ibs=1,那麼,每次讀取1位元組,而skip=4,則會從第五個位元組開始讀取:
dd if=test.txt of=test0.txt ibs=1 skip=4
得到內容:
$cat test0.txt wangxiansheng
那如果要從指定位置開始寫呢?
dd if=test.txt of=test0.txt obs=1 seek=5
這些寫入的內容就會從test0.txt的第六個位元組開始寫,而會保留前面的5個位元組。
注意,由於這裡我設置了ibs或者obs為1,所以skip和seek的單位都是位元組,但是如果前面設置的是如1M,那麼跳過的就是N兆了。
生成隨機文件
還記得在《Linux字符設備文件》中提到的特殊字符文件嗎?結合dd命令,我們可以生成一些隨機內容的文件。
$ dd if=/dev/urandom of=temp.txt count=2
執行之後就會讀取2個塊大小的數據到temp.txt中。
磁盤讀寫測試
由於dd命令每次執行完成後都會顯示其速度,因此可以利用它來測試當前的磁盤讀寫情況。 這裡還有一個選項oflag=FLAGS用來設置一些讀寫方式,FLAG常見選項有:
- direct 使用直接IO
- nonblock 使用非阻塞IO
- noatime 不更新訪問時間
- nocache 丟棄緩存
- sync 讀寫一次就寫到磁盤
- fsync 最後要寫到磁盤
$ dd if=/dev/urandom of=testfile count=100 oflag=sync 100+0 records in 100+0 records out 51200 bytes (51 kB, 50 KiB) copied, 0.0011526 s, 44.4 MB/s
總結
dd命令可用於文件拷貝,文件內容大小寫轉換,磁盤讀寫測試等。