在hadoop上删除x天以上的文件

时间:2016-07-28 16:17:26

标签: ruby bash hadoop fs

我正在构建一个bash脚本,用于删除指定目录中x天以前的日志文件。如你所知,hadoop fs上没有“find”,所以我在ruby中找到了一种巧妙的方法,并且想知道是否有办法在bash中实现这一点。

  

在Ruby中:

#!/usr/bin/env ruby 
require "date"

five_days_ago = Date.parse(Time.now.to_s) - 5
IO.popen("hadoop fs -lsr /tmp").each_line do |line|  
  permissions,replication,user,group,size,mod_date,mod_time,path = *line.split(/\s+/)
  if (mod_date)
    if Date.parse(mod_date.to_s) < five_days_ago
      puts line
      if permissions.split('')[0] == 'd'
        puts "deleting #{path}"
        `hadoop fs -rmr -skipTrash #{path}`
        dirname = path
        next
      end 
      next if path.start_with? dirname
      `hadoop fs -rm -skipTrash #{path}`
    end
  end
end

2 个答案:

答案 0 :(得分:1)

我明白了。我知道有些人不建议使用ls来解决这类问题,但是我使用grep -o来创建一个新行(所以我会知道期望的字符串)和我知道文件名模式是什么,所以这将完美地运作。

#!/bin/bash
IFS=$'\n'
source_path='/user/'
current_date=$(date +%Y-%m-%d)
files_ls=$(hdfs dfs -ls "$source_path" | grep -o " 2[0-9]\{3\}-.*")

for line in $files_ls; do
    last_mod=$(echo "$line" | grep -o "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}")
    file_path=$(echo "$line" | grep -o " /user/.*.log")
    time_diff="$(( ($(date --date="$current_date" +%s) - $(date --date="$last_mod" +%s) )/(60*60*24) ))"
    if [ "$time_diff" -ge "8" ]; then
        echo "hdfs dfs -rm -skipTrash$file_path"
    fi
done

答案 1 :(得分:0)

以下是我在bash中使用的内容,您可以尝试一下:

e.g。所有8个月大的文件。根据需要更改grep正则表达式模式:

hadoop fs -ls -R <location> | grep '.*2016-[0-8].*' | awk '{print $8}'

删除文件:

hadoop fs -rm -r `hadoop fs -ls -R <location> | grep '.*2016-[0-8].*' | awk '{print $8}'`