2016-07-28 30 views
2

Ich baue ein Bash-Skript, das Log-Dateien älter als x Tage in einem angegebenen Verzeichnis löscht. Wie Sie wissen, ist "find" auf den hadoops fs nicht verfügbar, also fand ich eine nette Methode, dies in Ruby zu tun und fragte mich, ob es einen Weg gibt, dies in bash zu erreichen.Löschen von Dateien älter als x Tage auf hadoop

In 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 

Antwort

0

Hier ist, was ich in der Bash verwenden, können Sie es versuchen:

z.B. grep alle 8 Monate alten Dateien. Ändern Sie grep RegexMuster nach Ihrem Bedarf:

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

Dateien löschen:

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

ich es herausgefunden. Ich weiß, dass es Leute gibt, die die Verwendung von ls für diese Art von Problemen nicht empfehlen, aber ich verwende grep -o, um eine neue Zeile zu erstellen (damit ich weiß, welche Zeichenfolgen zu erwarten sind) und ich weiß, wie das Dateinamensmuster ist also wird das perfekt funktionieren.

#!/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