文件讀寫測試,磁盤讀寫測試全靠它

  • 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命令可用於文件拷貝,文件內容大小寫轉換,磁盤讀寫測試等。