마지막(또는 처음) 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
작동을 거부하기 때문입니다).cat
cat
또는 다음을 사용하십시오 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"