2011-10-11 56 views
4

假設您有一個HDFS文件列表,其中包含一個通用前綴和遞增後綴。例如,Hadoop&Bash:刪除匹配範圍的文件名

part-1.gz, part-2.gz, part-3.gz, ..., part-50.gz 

我只想在目錄中留下幾個文件,比如說3.任何三個文件都可以。這些文件將用於測試,因此文件的選擇無關緊要。

什麼是簡單&最快的方式來刪除47個其他文件?

回答

14

幾個選項在這裏:


移動手動三個文件到一個新的文件夾,然後刪除舊文件夾。


抓住與fs -ls文件名,然後將頂部n,則RM他們。在我看來,這是最穩健的方法。

hadoop fs -ls /path/to/files給你LS輸出

hadoop fs -ls /path/to/files | grep 'part' | awk '{print $8}'打印出唯一的文件名(相應地調整grep來抓住你想要的文件)。

hadoop fs -ls /path/to/files | grep 'part' | awk '{print $8}' | head -n47抓住頂部47

拋出此爲一個for循環和RM他們:

for k in `hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47` 
do 
    hadoop fs -rm $k 
done 

而不是一個for循環,你可以使用xargs

hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47 | xargs hadoop fs -rm 

感謝基思的靈感

+1

'hadoop fs -ls | grep部分| awk'{print $ 8}'|頭-n47 | xargs -I {} hadoop fs -rm {}'也許? – Keith

+0

通過安全性,總是使用for循環,並且像這樣的''hadoop fs -rm/PATH .../$ file''前綴路徑,所以沒有機會刪除其他東西。 –

1
ls part-*.gz | sed -e "1,3d" | xargs rm 
+1

hadoop擁有與傳統ls/rm/etc不同的界面。 –

+0

感謝您的迴應,非常有用。不過,我編輯了這個問題,以強調HDFS。 – volni

+0

當我寫回答時,這個問題沒有提到HDFS。我應該刪除它嗎? – Keith

4

在Bash?

你想保留哪些文件,爲什麼?他們的名字是什麼?在上面的例子中,你可以做這樣的事情:

$ rm !(part-[1-3].gz) 

這將刪除除部分1.gz,部分2.gz,和部分3.gz所有文件。

你也可以做這樣的事情:

$ rm $(ls | sed -n '4,$p') 

這都將刪除除列出的最後三個文件。

你也可以這樣做:

$ls | sed -n '4,$p' | xargs rm 

,如果你有成百上千的文件目錄中的哪一個更安全。

+0

我想你的意思是'sed -n'4,$ p'',如果你想跳過前三行...... – pilcrow

+0

@pilcrow:你說得對。我會糾正錯誤 –

1

AWK:

ls part-*.gz|awk -F '[-\.]' '$2>3{print "rm "$0}' |sh 
3

你需要保持第一三的最後三頂?

要刪除所有,但三個第一:

hadoop fs -ls | grep 'part-[0-9]*\.gz' | sort -g -k2 -t- | tail -n +4 | xargs -r -d\\n hadoop fs -rm 

要刪除所有,但最後三個:

hadoop fs -ls | grep 'part-[0-9]*\.gz' | sort -g -k2 -t- | head -n -3 | xargs -r -d\\n hadoop fs -rm 

注意,這些命令不依賴於文件的實際數量,也不是否存在三個以上,也不是對原始列表的精確排序,但它們的確取決於該數字是否在連字符後。 xargs的參數不是絕對必要的,但它們在某些情況下可能會有所幫助。