Shell-Script
如何從unix中有超過60個文件的文件夾中刪除文件?
我想在 cronjob 中放置一個腳本,該腳本將在特定時間執行,如果文件數超過 60,它將從該文件夾中刪除最舊的文件。後進先出。我試過了,
#!/bin/ksh for dir in /home/DABA_BACKUP do cd $dir count_files=`ls -lrt | wc -l` if [ $count_files -gt 60 ]; then todelete=$(($count_files-60)) for part in `ls -1rt` do if [ $todelete -gt 0 ] then rm -rf $part todelete=$(($todelete-1)) fi done fi done
這些都是每天保存並命名為
backup_$date
. 這個可以嗎?
不,一方面它會破壞包含換行符的文件名。它也比必要的複雜,並且具有解析 ls的所有危險。
更好的版本是(使用 GNU 工具):
#!/bin/ksh for dir in /home/DABA_BACKUP/* do ## Get the file names and sort them by their ## modification time files=( "$dir"/* ); ## Are there more than 60? extras=$(( ${#files[@]} - 60 )) if [ "$extras" -gt 0 ] then ## If there are more than 60, remove the first ## files until only 60 are left. We use ls to sort ## by modification date and get the inodes only and ## pass the inodes to GNU find which deletes them find dir1/ -maxdepth 1 \( -inum 0 $(\ls -1iqtr dir1/ | grep -o '^ *[0-9]*' | head -n "$extras" | sed 's/^/-o -inum /;' ) \) -delete fi done
請注意,這假定所有文件都在同一個文件系統上,如果不是,則可能會產生意想不到的結果(例如刪除錯誤的文件)。如果有多個硬連結指向同一個 inode,它也不會很好地工作。