假設您有一個HDFS文件列表,其中包含一個通用前綴和遞增後綴。例如,Hadoop&Bash:刪除匹配範圍的文件名
part-1.gz, part-2.gz, part-3.gz, ..., part-50.gz
我只想在目錄中留下幾個文件,比如說3.任何三個文件都可以。這些文件將用於測試,因此文件的選擇無關緊要。
什麼是簡單&最快的方式來刪除47個其他文件?
假設您有一個HDFS文件列表,其中包含一個通用前綴和遞增後綴。例如,Hadoop&Bash:刪除匹配範圍的文件名
part-1.gz, part-2.gz, part-3.gz, ..., part-50.gz
我只想在目錄中留下幾個文件,比如說3.任何三個文件都可以。這些文件將用於測試,因此文件的選擇無關緊要。
什麼是簡單&最快的方式來刪除47個其他文件?
幾個選項在這裏:
移動手動三個文件到一個新的文件夾,然後刪除舊文件夾。
抓住與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
感謝基思的靈感
在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
,如果你有成百上千的文件目錄中的哪一個更安全。
我想你的意思是'sed -n'4,$ p'',如果你想跳過前三行...... – pilcrow
@pilcrow:你說得對。我會糾正錯誤 –
AWK:
ls part-*.gz|awk -F '[-\.]' '$2>3{print "rm "$0}' |sh
你需要保持第一三的最後三頂?
要刪除所有,但三個第一:
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
的參數不是絕對必要的,但它們在某些情況下可能會有所幫助。
'hadoop fs -ls | grep部分| awk'{print $ 8}'|頭-n47 | xargs -I {} hadoop fs -rm {}'也許? – Keith
通過安全性,總是使用for循環,並且像這樣的''hadoop fs -rm/PATH .../$ file''前綴路徑,所以沒有機會刪除其他東西。 –