뭐, 여기에 코드를 요청했는데 처음에는 비지박스와 호환되게 해달라고 요청하지 않았습니다. 내 잘못. 저는 Linux와 코딩을 처음 접했습니다.
코드는 다음을 수행해야 합니다.
하드 드라이브 용량이 95%에 도달하면 디렉터리(파일이 있는 디렉터리)에서 가장 오래된 데이터 중 50GB를 삭제합니다.
그들이 나에게 준 코드는 busybox와 작동하지 않는다는 것이었습니다:
DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"
find $DIRS -type f -printf "%T@ %s %p\n" | sort -r -n | while read time bytes filename
do
rm -fv "$filename"
DELBYTES=$((DELBYTES + bytes))
if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done
작동하지 않는 것:
- -printf(-print로 변경)
- %T@ %s %p\n(무엇으로 변경해야 할지 모르겠습니다)
- 그 밖의 무엇이 작동하지 않는지 잘 모르겠습니다. 저는 코딩과 Linux를 처음 접했습니다.
이제 임베디드 Linux 시스템에서 실행할 수 있도록 이를 busybox로 변환해야 합니다. 또한 매주 금요일에 실행되도록 cron 명령을 추가해야 합니다.
답변1
~부터바쁜 상자구현하다찾다사용자 정의 출력 형식은 제공되지 않으므로 서식 지정 작업을 별도의 프로그램에 아웃소싱해야 합니다 :) busybox
다행히도stat
주문하다. 출력 형식 필드는 다음과 다릅니다.GNU 찾기용도가 다르기 때문에 사용해야 하는 기호도 다릅니다. 아래 스크립트에서는 합계가 에서 find
나온 것으로 가정합니다 .stat
busybox
DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"
find $DIRS -type f -exec stat -c "%Y %s %n" {} \; | sort -r -n | while read time bytes filename
do
rm -fv "$filename"
DELBYTES=$((DELBYTES + bytes))
if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done
항상 그렇듯이, 각 명령을 사용하기 전에 해당 명령에 대한 설명을 읽어 보십시오. 그렇다면 busybox
해당 맨페이지를 찾을 수 없지만 --help
맨페이지를 사용하여 사용 정보를 표시할 수 있습니다.
이 해결 방법은 파일 이름에 개행 문자가 포함되어 있을 경우 문제가 발생할 수 있다는 점에 유의하세요! 정상적인 시스템에서는 이런 일이 발생해서는 안 되지만, 예를 들어 누군가가 시스템에 침입하거나 임의의 파일 생성을 허용하는 일부 취약점을 악용하는 경우 발생할 수 있습니다.
이런 상황에서 유용한 파일을 실수로 삭제하는 것을 방지하려면 먼저 이름에 줄바꿈이 포함된 모든 파일을 찾아서 삭제해야 합니다. 이를 나열하려면 다음을 실행하세요.
find / -name "*
*"
(가지다오직별표 사이에 줄 바꿈이 있습니다. ) 그런 다음 이러한 파일이 모두 필요하지 않다고 확신하면 다음 방법 중 하나를 사용하여 파일을 삭제하세요.
find / -name "*
*" -delete
또는
find / -name "*
*" -print0 | xargs -0 rm -vf
둘 다 와 함께 작동해야 합니다 busybox
.
답변2
일반적으로 말하면,출력을 구문 분석하는 것은 나쁜 생각입니다.ls
. 그러나 stat
zsh, Perl 또는 기타 대규모 스크립트 언어가 없는 임베디드 시스템에서는 find -printf
이것이 날짜별로 파일을 정렬하는 유일한 방법입니다. 파일 이름에 공백이나 공백 \'"
( xargs
손상을 일으킬 수 있음)이 없다고 가정하면(원래 스크립트에서 가정한 가정임) xargs ls -str
날짜별로 정렬된 파일을 표시하고 프로세스 크기로 표시할 수 있습니다.
find $DIRS -type f |
xargs ls -str |
while read kilobytes filename; do …
크기는 바이트가 아닌 킬로바이트로 표시됩니다. 또한 이는 파일의 바이트 수가 아니라 파일이 차지하는 디스크 공간입니다. 일반적으로 이 숫자는 다음 정수 블록으로 반올림된 파일 크기입니다.부족한. 디스크 공간을 확보하는 스크립트에서는 이것이 원하는 것일 수 있습니다.
위 스크립트에는 큰 주의 사항이 있습니다. 파일 수가 충분히 작으면 xargs
정렬 할 수 있습니다 ls
. 여러 번 호출하면 ls
각 호출이 인수를 개별적으로 정렬합니다. 인쇄 파일 날짜를 사용할 수 있지만 ls
사람이 읽을 수 있는 출력을 정렬하는 것은 매우 복잡합니다. 최소한 오류 조건을 감지하는 더 나은 솔루션은 find
.
{ set -f; IFS='
'; ls -str $(find $DIRS -type f); } |
while read -r kilobytes filename; do …