Shell-Script

如何從unix中有超過60個文件的文件夾中刪除文件?

  • June 15, 2015

我想在 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,它也不會很好地工作。

引用自:https://unix.stackexchange.com/questions/209555