2016-07-28 1 views
2

x 일보다 오래된 로그 파일을 지정된 디렉토리에서 삭제하는 bash 스크립트를 빌드 중입니다. 아시다시피 "찾기"는 hadoop fs에서 사용할 수 없으므로 루비에서이 작업을 수행하는 깔끔한 방법을 발견했으며이를 bash에서 수행 할 수있는 방법이 있는지 궁금해하고있었습니다. 루비에서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

이 무엇인지 나는 떠들썩한 파티에서 사용하는, 당신은 그것을 시도 할 수 있습니다 :

예를 들어, grep 모든 8 개월 된 파일. 당신의 필요에 따라 그렙 정규식 패턴을 변경합니다

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