Shell 스 크 립 트 가 지정 한 크기 파일 의 테스트 데 이 터 를 만 듭 니 다.

우 리 는 테스트 나 디 버 깅 을 할 때 어떤 size 의 파일 을 생 성 해 야 합 니 다.예 를 들 어 저장 시스템 을 테스트 할 때 디스크 의 남 은 공간 을 5G 로 줄 여야 합 니 다.가장 쉬 운 방법 은 5G 파일 을 복사 하 는 것 입 니 다.그런데 이런 크기 의 파일 을 어디서 구 할 수 있 습 니까?아마도 당신 은 파일 을 찾 아서 끊임없이 복사 하고 마지막 에 합병 할 생각 입 니 다.이것 도 하나의 방법 이 라 고 할 수 있 지만 dd 가 있 으 면 더욱 쉽 고 유연 하 게 실현 할 수 있 습 니 다.
케이스 바 이 케이스 의 dd 사용법 을 소개 하 겠 습 니 다.첫 번 째 거 먼저 볼 게 요.
5G 크기 의 파일 을 만 들 고 내용 은 요구 하지 않 습 니 다.
명령 은 아래 와 같다.

$ dd if=/dev/zero of=tmp.5G bs=1G count=5 
여기에 사용 되 는 매개 변 수 를 설명해 주세요.

if=FILE      : , 。 /dev/zero Linux , null ( 0) 
of=FILE      : ,  
bs=BYTES     : , K、M、G 。 ibs、obs , bs, ibs obs  
count=BLOCKS : block ,block ibs ( ) 
이렇게 위 에 5G 파일 을 생 성 하 라 는 명령 은/dev/null 에서 1G 데 이 터 를 읽 을 때마다 5 번 읽 고 tmp.5G 라 는 파일 을 쓰 는 것 을 잘 이해 할 수 있 습 니 다.
다음 문제 볼 게 요.

file.in 1M file.out
명령 은 아래 와 같다.

$ file_out_size=`du -b file.out | awk '{print $1}'` 
$ dd if=./file.in ibs=1M count=1 of=./file.out seek=1 obs=$file_out_size
여기 ibs 와 obs 는 서로 다른 값 으로 설정 되 어 있 습 니 다.앞의 명령 에 비해 하나의 seek 인자 만 추가 되 었 습 니 다.

seek=BLOCKS : , BLOCKS block,block obs  
명령 의 뜻 은 file.in 에서 1M 데이터 블록 1 개 를 읽 어 file.out 에 쓰 는 것 입 니 다.그러나 기록 위 치 는 file.out 의 시작 이 아니 라 1*$file 입 니 다.out_size 바이트 오프셋(즉 파일 끝)
이 기초 위 에 요 구 를 하나 더 추가 하 다
file.in 의 3M 을 file.out 의 끝 에 추가 합 니 다.

$ file_out_size=`du -b file.out | awk '{print $1}'` 
$ dd if=./file.in skip=2 ibs=1M count=1 of=./file.out seek=1 obs=$file_out_size 
여기 인자 skip 이 하나 더 생 겼 습 니 다.

skip=BLOCKS : , BLOCKS block,block ibs 。 seek
위의 명령 은 파일 file.in 부터 2*1M 을 건 너 뛰 고 1*1M 데 이 터 를 복사 하여 파일 file.out 의 1*$file 을 기록 하 라 는 뜻 입 니 다.out_사이즈 오프셋
이러한 기본 적 인 매개 변 수 는 모두 소개 되 었 습 니 다.입 출력 파일 과 각자 의 오프셋 을 설정 하고 읽 기와 쓰기 데이터 블록 크기 와 읽 기 데이터 블록 개 수 를 설정 하 는 것 이 아 닙 니 다.다음은 요약 하 겠 습 니 다.

: 
    if 
    skip 
    ibs 
    count 
: 
    of 
    seek 
    obs 
마지막 으로 궁극 의 문제.앞 에 만 든 것 은 모두 null 흐름 입 니 다.이번 에는 바 꿉 니 다.

, 。 , 123456 , A
이 문 제 는 아무런 의미 가 없 는 것 처럼 보이 지만,때로는 확실히 필요 하 다.예 를 들 어 저 는/dev/null 을 통 해 1G 파일 을 만 들 었 습 니 다.그러나 테스트 수요 로 중간 100 M 데 이 터 를 수정 하고 싶 습 니 다.이때 저 는 100 M 파일 을 만들어 서 1G 파일 의 지정 한 위치 에 기록 해 야 합 니 다.이 100 M 파일 은/dev/null 에서 만 들 수 없습니다.그렇지 않 으 면 수정 목적 에 이 르 지 못 할 때 이런 기능 이 필요 합 니 다.
말 이 많 지 않 으 면 바로 각본 에 올 라 가 앞의 기초 가 있 으 면 모두 알 아 볼 수 있 을 것 이 라 고 믿는다.

#!/bin/bash 
if [ $# -ne 3 ];then 
    echo "usage : $0 character out_file file_size(Byte)" 
    exit 1 
fi 
 
echo "$1" | grep -q "^[a-zA-Z]$" 
if [ $? -ne 0 ];then 
    echo "arg1 must be character" 
    exit 1 
fi 
 
character=$1 
out_file=$2 
target_size=$3 
 
# echo '
' , dd  
echo "$character" | dd of=$out_file ibs=1 count=1 
while true 
do 
    cur_size=`du -b $out_file | awk '{print $1}'` 
    if [ $cur_size -ge $target_size ];then 
        break 
    fi 
    remain_size=$((target_size-$cur_size)) 
    if [ $remain_size -ge $cur_size ];then 
        input_size=$cur_size 
    else 
        input_size=$remain_size 
    fi 
    dd if=$out_file ibs=$input_size count=1 of=$out_file seek=1 obs=$cur_size || exit 1 
done 
이러한 기술 이 있 으 면 파일 내용 에 대한 요구 가 없 는 전제 에서 지정 한 크기 의 파일 을 임의로 만 들 고 파일 지정 바이트 수 를 임의로 수정 할 수 있 습 니 다.이것 은 일부 테스트 장 소 를 매우 편리 하 게 만 들 수 있 습 니 다.

좋은 웹페이지 즐겨찾기