保留最近的3个文件夹并在bash脚本中删除其余文件夹?

时间:2014-04-04 08:42:37

标签: linux bash shell sh

我是shell脚本的新手。能否请您提供一些以下要求的代码?

我有以下格式化文件夹

示例:/home/backup/store_id/datewisefolder/some.zip

喜欢:/home/backup/44/22032014/some_file.zip

  /home/backup/44/23032014/some_file.zip 

  /home/backup/44/24032014/some_file.zip 

   /home/backup/44/25032014/some_file.zip

更多..

我想去每家商店的id文件夹&只保留最近3个日期文件夹的其余部分。这里有44个商店id文件夹23032014,24032014,25032014这三个是最近的一个所以保持原样。 22032014年龄较大,请删除一个。

我编写了shell代码,找出最近的三个文件,但我不知道如何使用store_ID文件夹循环删除休息。

下面的代码找出最近的文件夹日期

cd / home / backup / 44 / ls -1 | sort -n -k1.8 -k1.4 -k 1 |尾巴-3

4 个答案:

答案 0 :(得分:0)

下面的脚本可以工作。

declare -a axe
axe=`ls -l /home/backup/* | sort -n -k1.8 -k1.4 -k 1|head -n -3`

for i in $axe
do
  rm -rf $i;
done

答案 1 :(得分:0)

find是执行此类任务的常用工具:

find ./my_dir -mtime +3 -delete

explaination:

./my_dir your directory (replace with your own)
-mtime +3 older than 3 days
-delete delete it.

或根据您的脚本代码

files=(`ls -1 /my_dir | sort -n -k1.8 -k1.4 -k 1 | tail -3`)

for i in *; do 
 keep=0; 
 #Check whether this file is in files array:
 for a in ${files[@]}; do 
  if [ $i == $a ]; then 
   keep=1; 
  fi; 
 done; 
 # If it wasn't, delete it
 if [ $keep == 0 ]; then 
  rm -rf $i;
 fi;
done

答案 2 :(得分:0)

ls /home/backup | while read store_id
do
  count=0
  ls -t /home/backup/$store_id | while read dir_to_remove
  do
    count=$((count + 1))
    if [ $count -gt 3 ]; then
      rm -rf /home/backup/$store_id/$dir_to_remove
    fi
  done
done

答案 3 :(得分:0)

依次cd进每个store_id目录。创建一个目录列表,其中包含以相反顺序排序的八位数名称(最近一次);最后传递列表的一部分,省略第一个$ retain元素到rm。

basedir=/home/backup
# How many directories to keep:
retain=3

shopt -s nullglob

# Assuming that anything beginning with a digit is a store_id directory.
for workdir in "$basedir"/[0-9]*/ ; do
  (
    cd "$workdir" || exit 1
    # Create the list.  The nullglob option ensures that if there are no
    # suitable directories, rmlist will be empty.
    rmlist=(
        $(
          printf '%s\n' [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ |
          sort -nr -k1.5,1.8 -k1.3,1.4 -k1.1,1.2
        )
      )
    # If there are fewer than $retain entries in ${rmlist[@]}, rm will be
    # given no names and so do nothing.
    rm -rf -- "${rmlist[@]:$retain}"
  )
done