크기별로 파일 내용 지우기

크기별로 파일 내용 지우기

디렉터리의 파일을 나열할지 여부를 고려하세요.

drwx--x--x 43 root wheel 4.0K Aug 18 12:52 ..
-rw-------  1 root root  268K Aug 18 04:31 build_locale_databases_log
-rw-------  1 root root  5.2M Aug 18 17:21 access_log
-rw-------  1 root root   85K Aug 18 17:14 cpbackup_transporter.log
-rw-------  1 root root  2.1M Aug 18 05:49 cphulkd.log
-rw-------  1 root root  3.2M Aug 18 17:19 error_log
-rw-------  1 root root  1.7M Aug 18 12:52 license_log

여기서는 2Mb. (즉) 다음 파일의 파일 크기를 0바이트로 만듭니다.

access_log
cphulkd.log
error_log

답변1

나는 직접적인 질문에 먼저 대답하는 것을 좋아하지만,내 답변을 읽기 전에 이 명령을 실행하지 마세요. 귀하가 요청한 명령(아마도 원하는 것이 아닐 수도 있음)은 다음과 같습니다.

find /wherever -type f -name '*.log' -size +4096 -print \
    | xargs truncate --size 0

+4096은 파일에 512바이트의 4096개 이상의 섹터가 있음을 의미합니다. 문제는 이것이 프로세스가 활발하게 기록하고 있는 로그 파일인 경우 해당 프로세스가 파일에서 해당 위치를 유지한다는 것입니다. 디스크 공간을 복구할 수 있지만(파일 시스템이 대부분의 파일 시스템이 지원하는 희소 파일을 지원한다고 가정), 로그를 보면 처음에는 블록이 0개입니다. 따라서 이 작업을 수행한 후 즉시 데몬을 다시 시작해야 합니다. 아니면 파일을 방해가 되지 않는 곳으로 옮기고 데몬을 다시 시작하는 것이 더 좋습니다.

cd /wherever
find . -name '*.log' -maxdepth 1 -size +4096 -exec mv {} {}.old \;
systemctl restart yourservice (or whatever you need to restart)
rm -f *.old

답변2

find 명령을 사용하여 이 작업을 수행할 수 있습니다.

for i in $(find . -type f -size +2097152c);do  cat /dev/null > $i;done

find 명령은 find . -type f -size +2097152c크기가 다음보다 큰 모든 파일을 찾습니다.

2MB(2097152바이트)

for 루프는 find 명령에서 얻은 파일 목록을 반복하고 다음을 사용합니다.cat /dev/null

- - - 편집하다- - -

user3188445가 제안한대로 이 방법을 시도해 볼 수도 있습니다.

for i in $(find . -type f -size +2097152c);do  :  > $i;done

답변3

옳은:

find . ! -name . -prune -type f -size +2097152c -exec sh -c '
  for f do
    : > "$f"
  done
' sh {} +

GNU 찾기 또는 BSD 찾기를 사용하십시오.

find . -maxdepth 1 -type f -size +2M ...

답변4

나는 다음을 생각해 냈습니다.

find . -type f -size '+2M' -print | while read i
do
echo " " > $i
done

이것은 작동합니다.

관련 정보