파일 데이터의 X%를 삭제하시겠습니까? (파일의 일부가 유효하지 않습니다)

파일 데이터의 X%를 삭제하시겠습니까? (파일의 일부가 유효하지 않습니다)

마지막(또는 처음) 25%만 파일에 남도록 파일의 최대 75%를 삭제하는 방법이 있습니까?

전체 파일을 무효화할 수 있는데, cat /dev/null > /var/mail/root이 경우에는 파일의 최대 75%까지만 삭제(무효화)하면 됩니다.

Bash에서 이를 수행할 수 있는 방법이 있나요? 위 명령 사용에 관해 내가 찾은 모든 문서는 100% 효과가 없습니다.

답변1

GNU를 사용하여 파일을 75%로 자르려면 truncate다음을 수행할 수 있습니다.

size=$(wc -c < "$file") &&
  truncate -s "$((size * 75 / 100))" -- "$file"

그리고 ksh93:

<>; $file >#((EOF * 75 / 100))

앞부분을 제거하려면 일반적으로 파일 내용을 다시 작성해야 합니다. 이 작업은 파일 자체에 작성하여 수행할 수 있습니다 ksh93.

command /opt/ast/bin/cat < $file <#((EOF * 25 / 100)) <>; $file

(여기서 내장 명령이 사용된 이유는 GNU와 같은 다른 구현이 ksh93표준 출력이 표준 입력과 동일한 파일을 참조하는 경우 cat작동을 거부하기 때문입니다).catcat

또는 다음을 사용하십시오 perl.

perl -pe '
  BEGIN{
    seek(STDIN,0,2) or die$!;
    seek(STDIN,tell(STDIN)*75/100,0) or die$!;
    $/ = \65536
  }
  END{truncate STDOUT, tell STDOUT}' < "$file" 1<> "$file"

Linux 및 일부 파일 시스템에서는 파일을 다시 쓰지 않고 파일 끝 이후의 부분을 삭제할 수 있지만 파일 시스템 블록 크기의 배수에서만 가능합니다. 큰 파일의 경우 이것으로 충분할 수 있습니다.

block_size=$(stat -Lc %o -- "$file") &&
  size=$(wc -c < "$file") &&
  fallocate -cl "$((size * 25 / 100 / block_size * block_size)) -- "$file"

관련 정보