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

jc3wubiy  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(438)

我正在构建一个bash脚本,用于删除指定目录中早于x天的日志文件。正如您所知,“find”在hadoopfs上是不可用的,所以我在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
bxfogqkk

bxfogqkk1#

我想出来了。我知道有些人不推荐使用 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
gywdnpxw

gywdnpxw2#

下面是我在bash中使用的内容,您可以尝试一下:
e、 格雷普所有8个月前的文件。根据需要更改grep regex模式:

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}'`

相关问题