거의 꽉 찬 큰 공유(~5TB)가 있습니다. 이제 지정된 2개의 폴더에서 데이터를 삭제하는 스크립트를 만들고 싶습니다. 하지만 이는 가장 오래된 파일/폴더여야 하며, 50GB 정도 삭제되면 중지되어야 하므로 모든 폴더가 삭제되는 것은 아닙니다.
편집하다:이것은 내 Synology DS-409의 Samba 공유와 함께 사용해야 합니다. 이 스크립트는 Synology의 /etc/crontab에서 실행되어야 합니다.
다른 곳에서는 나에게 다음 코드를 제공했습니다.
#!/opt/bin/bash
dir=/data/video
min_dirs=3
full=60
logfile=/var/tmp/removed.log
df=`df | grep data | awk '{print $5}' | sed s/%//g`
if [ $df -gt $full ]; then
[[ $(find "$dir" -type d | wc -l) -ge $min_dirs ]] &&
IFS= read -r -d $'\0' line < <(find "$dir" -printf '%T@ %p\0' 2>/dev/null | sort -z -n)
file="${line#* }"
ls -lLd "$file"
#rm -rf "$file"
date=`date`
if [ -f "$file" ]; then
echo "$date $file could not be removed!" >> $logfile
else
echo "$date $file removed" >> $logfile
fi
fi
답변1
이것은 작동합니다:
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
답변2
scai, autodelete.txt 는 Windows에서 생성하여 Linux 공유에 업로드한 파일입니다 :) 이제 Windows Linux 코드 문제로 인해 Nano에서 이 코드를 작성했습니다.
하지만 이제는 많은 오류가 발생합니다.
root ~/.config # sh autodelete
find: unrecognized: -printf
BusyBox v1.20.2 (2012-08-09 05:49:15 CEST) multi-call binary.
Usage: find [PATH]... [OPTIONS] [ACTIONS]
Search for files and perform actions on them.
First failed action stops processing of current file.
Defaults: PATH is current directory, action is '-print'
-follow Follow symlinks
Actions:
! ACT Invert ACT's success/failure
ACT1 [-a] ACT2 If ACT1 fails, stop, else do ACT2
ACT1 -o ACT2 If ACT1 succeeds, stop, else do ACT2
Note: -a has higher priority than -o
-name PATTERN Match file name (w/o directory name) to PATTERN
-iname PATTERN Case insensitive -name
-path PATTERN Match path to PATTERN
-ipath PATTERN Case insensitive -path
-type X File type is X (one of: f,d,l,b,c,...)
-links N Number of links is greater than (+N), less than (-N),
or exactly N
If none of the following actions is specified, -print is assumed
-print Print file name
-exec CMD ARG ; Run CMD with all instances of {} replaced by
file name. Fails if CMD exits with nonzero
autodelete: line 11: bytes: not found