이진 데이터와 함께 표준 입력 및 출력을 사용하는 것이 안전합니까?


14

이진 파일을 두 개로 나눌 필요가 있습니다. 머리 및 / 또는 꼬리를 사용할 수 있는지 궁금하지만 궁금한 점이 있습니다 ... 이진 데이터와 함께 리디렉션, 파이프 등을 사용하는 것이 안전합니까? 줄 바꿈이 엉망이거나 널이 무시되거나 백 스페이스 또는 삭제가 특별한 작업을합니까? (bash, 쿠분투 18.04 LTS)


1
split명령을 살펴보십시오 .
egmont

답변:


19

예, 다른 프로세스로 파이프하거나 파일로 저장하면 안전합니다. 이진 stdout이 터미널 디스플레이에 일시적으로 엉망이 될 수있는 이스케이프 시퀀스 (임의로)를 포함 할 수 있기 때문에 이진 stdout을 터미널에 인쇄하게하면 잠재적 인 "이상성"이 발생합니다.


6
이 경우 입력 reset하고 Enter 키를 눌러 수정할 수 있습니다.
Baard Kopperud

4
@BaardKopperud 나는 tset / reset이 작동하지 않는 코너 사례에 대해 읽은 줄 알았다.
Xen2050

1
잘 모르겠어요. 일부 이스케이프 시퀀스가 ​​키보드 레이아웃 / 인코딩을 변경 reset<enter> 하여 터미널에서 보여지는 것과 같이 문자를 입력 할 때 실제로 해당 시퀀스 를 입력 하지 않는 유일한 경우 ...
Bakuriu

3
이진 파일을 표시 한 후 터미널 수정CTRL + C 후에 콘솔을 재설정해야하는 이유를 참조하십시오 . 첫 번째 링크에서 제안했듯이 stty sane; tput rs1일련의 명령은 reset작동하지 않는 코너 케이스가있을 때 트릭을 수행합니다 . Bakuriu가 언급 한 것 외에도 이러한 경우에는 터미널 라인 / 열 너비가 포함될 수 있거나 직렬 통신 (보레이트 / 패리티)과 관련된 설정을 추측하고 있습니다.
Sergiy Kolodyazhnyy

1

head또는 같은 명령을 사용할 때의 주요 문제점은 명령 tail이 행 지향적이고 이진 파일이 아니라는 것입니다. 줄 바꿈이있는 경우 줄 끝을 나타내는 데 사용되지 않는 경우가 많으며 그럴 경우 프로그램 메시지 또는 데이터 필드와 같은 문자열의 일부일 수 있습니다.

데이터가 어떤 식 으로든 구조화되어 있다면 분리 점을 선택할 때이를 고려하여 중간에 구조가 깨지지 않도록해야합니다.

파일의 구조를 알고 있다면 다음과 같은 명령을 사용할 수 있습니다

dd -if input-file -of output-file ...

특정 (증분 된) 오프셋에서 시작하여 특정 크기의 너무 많은 데이터 블록 만 파일로 복사하는 옵션이 있습니다.

그것은처럼 보이는 split당신을 위해이 프로세스를 자동화합니다 @egmont에서 언급 한 바와 같이 명령하지만, 추가 옵션을 지정해야합니다, 그래서 라인 지향 기본적으로 나타납니다 같은 --bytes count방법 큰 파일의 각 조각을해야 그것을 말해 있다.


참고로, 파일의 내용을 모르지만 적어도 의미있는 텍스트 데이터가 포함되어 있다고 의심되는 경우 strings명령은 처리중인 내용을 먼저 살펴 보는 좋은 방법입니다.

strings -n 6 file | less

최소 6 자 이상의 인쇄 가능한 문자를 모두 찾아서 호출기에 표시하여 터미널에서 날지 않도록합니다. 기본값 인 4 자보다 조금 더 큰 숫자를 사용하면 인쇄 할 수 있지만 파일에서 그렇게 사용되지 않는 작은 데이터 조각을 제거 할 수 있습니다.

나중에와 같은 이진 편집기를 사용하여 파일을 더 자세히 탐색해야하는 경우 hexedit흥미로운 부분을 찾을 수있는 랜드 마크가 있습니다.

strings옵션이 있습니다- t x 인쇄 된 각 문자열 앞에 파일의 오프셋이 16 진수 (8 진수 / 10의 경우 10 진수)로 표시되어 나중에 찾을 위치를 알 수 있습니다. 매우 짧은 파일이라도 문자별로보아야 할 때 처리해야 할 것이 많습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.