我正在构建一个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
答案 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}'`