2016-07-28 20 views
2

x日より古いログファイルを指定のディレクトリで削除するbashスクリプトをビルドしています。あなたが知っているように、 "find"はhadoop fsで利用できないので、私はルビーでこれを行うきちんとした方法を見つけ出し、bashでこれを達成する方法があるかどうか疑問に思っていました。 Rubyでhadoopでx日より古いファイルを削除します。

ここ
#!/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 
関連する問題