Shell script to count files, then remove oldest files

后端 未结 11 2214
眼角桃花
眼角桃花 2021-01-30 05:29

I am new to shell scripting, so I need some help here. I have a directory that fills up with backups. If I have more than 10 backup files, I would like to remove the oldest fi

相关标签:
11条回答
  • 2021-01-30 05:30

    Using inode numbers via stat & find command (to avoid pesky-chars-in-file-name issues):

    stat -f "%m %i" * | sort -rn -k 1,1 | tail -n +11 | cut -d " " -f 2 | \
       xargs -n 1 -I '{}' find "$(pwd)" -type f -inum '{}' -print
    
    #stat -f "%m %i" * | sort -rn -k 1,1 | tail -n +11 | cut -d " " -f 2 | \
    #   xargs -n 1 -I '{}' find "$(pwd)" -type f -inum '{}' -delete 
    
    0 讨论(0)
  • 2021-01-30 05:31

    Straightforward file counter:

    max=12
    n=0
    ls -1t *.dat |
    while read file; do
        n=$((n+1))
        if [[ $n -gt $max ]]; then
            rm -f "$file"
        fi
    done
    
    0 讨论(0)
  • 2021-01-30 05:31

    Based on others suggestions and some awk foo, I got this to work. I know this an old thread, but I didn't find a decent answer here and this sorted it for me. This just deletes the oldest file, but you can change the head -n 1 to 10 and get the oldest 10.

    find $DIR -type f -printf '%T+ %p\n' | sort | head -n 1 | awk '{first =$1; $1 =""; print $0}' | xargs -d '\n' rm

    0 讨论(0)
  • 2021-01-30 05:39

    Make sure your pwd is the correct directory to delete the files then(assuming only regular characters in the filename):

    ls -A1t | tail -n +11 | xargs rm
    

    keeps the newest 10 files. I use this with camera program 'motion' to keep the most recent frame grab files. Thanks to all proceeding answers because you showed me how to do it.

    0 讨论(0)
  • 2021-01-30 05:41

    I like the answers from @Dennis Williamson and @Dale Hagglund. (+1 to each)

    Here's another way to do it using find (with the -newer test) that is similar to what you started with.

    This was done in bash on cygwin...

    if [[ $(ls /backups | wc -l) > 10 ]]
    then
      find /backups ! -newer $(ls -t | sed '11!d') -exec rm {} \;
    fi
    
    0 讨论(0)
  • 2021-01-30 05:46

    find is the common tool for this kind of task :

    find ./my_dir -mtime +10 -type f -delete
    

    EXPLANATIONS

    • ./my_dir your directory (replace with your own)
    • -mtime +10 older than 10 days
    • -type f only files
    • -delete no surprise. Remove it to test your find filter before executing the whole command

    And take care that ./my_dir exists to avoid bad surprises !

    0 讨论(0)
提交回复
热议问题