2016-07-28 49 views
2

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

在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 

回答

0

这是我在bash干什么用的,你可能会尝试一下:

例如grep所有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}'` 
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 
相关问题