디렉터리의 파일을 나열할지 여부를 고려하세요.
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
이것은 작동합니다.