디스크 공간 부족: 파일을 복사하지 않고 텍스트 파일의 처음 n줄 삭제 [중복]

디스크 공간 부족: 파일을 복사하지 않고 텍스트 파일의 처음 n줄 삭제 [중복]

$rmv.라는 거대한 텍스트 파일의 첫 번째 줄을 삭제하고 싶습니다 $filename. 이 텍스트 파일은 너무 커서 내 하드 드라이브에 두 개의 복사본을 저장할 수 없습니다.

다음은 다음과 같은 빈 파일을 남깁니다 $filename.

tail -n +$rmv "$filename" > "$filename" 

$filename합계를 저장할 저장 공간이 부족하여 다음을 실행할 수 없습니다 $filename.tmp.

tail -n +$rmv "$filename" > "$filename.tmp" && mv "$filename.tmp" "$filename"

중요한 경우에는 Mac OS X El Capitan을 사용하고 있습니다.

답변1

당신이 가지고 있다면 perl:

{
  tail -n +"$rmi"
  perl -e 'truncate STDOUT, tell STDOUT'
} <file 1<>file

이 방법을 사용하면 파일 백업이 없으므로 손상이 발생하면 데이터가 손실될 수 있습니다.

답변2

ed임시 파일은 사용하지 않는 것 같아서

ed bigfile <<ED_SCRIPT
1,${rmv}d
w
q
ED_SCRIPT

답변3

스크립트 파일 편집의 경우,선택한 도구는ex.

ex -sc "1,${rmv}d | x" "$filename"

당신은 또한 볼 수 있습니다split유용.

답변4

귀하의 텍스트 파일은 xMB이고 2* xMB는 없지만 파일을 압축할 공간이 충분하지 않은 것 같나요? 텍스트 파일은 일반적으로 원래 크기의 1/10로 압축됩니다.

($total-$rmv) 행을 수용할 공간이 충분하지 않습니다. 하지만 압축되면 어떻게 될까요?tail -n +$rmv "$filename" | gzip > "$filename.tmp" && zcat "$filename.tmp" > "$filename"

이것을 추상적인 지적 문제로 생각하여 파일을 덩어리로 자르고, 메모리나 사용 가능한 디스크 공간에 맞게 크기를 조정하고, 마지막 덩어리부터 시작한 다음 원본 파일을 자릅니다. 또한 파일을 제자리에 압축하기 위해 속임수를 사용할 수도 있습니다 dd conv=notrunc.

그러나 실제로 나는

  • ($total-$rmv) 행을 (만) 보유할 만큼 충분한 디스크가 있는 서버에 네트워크를 통해 파일을 복사하고 올바른 행을 얻었는지 확인한 다음 원본 파일을 삭제하고 다시 복사했습니다.

  • 분명히 필요하므로 디스크를 추가하십시오.

관련 정보