Hadoop& Bash:删除匹配范围的文件名

时间:2011-10-11 22:05:46

标签: bash hadoop

假设您有一个HDFS文件列表,其中包含一个公共前缀和一个递增后缀。例如,

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

我只想在目录中留下一些文件,比如说3.任何三个文件都可以。这些文件将用于测试,因此文件的选择无关紧要。

什么是简单&删除其他47个文件的最快方法是什么?

5 个答案:

答案 0 :(得分:16)

这里几个选项:


手动将三个文件移动到新文件夹,然后删除旧文件夹。


使用fs -ls抓取文件名,然后拉出顶部n,然后将它们拉出来。在我看来,这是最强大的方法。

hadoop fs -ls /path/to/files为你提供输出

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循环中,然后发送它们:

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

您可以使用xargs

而不是for循环
hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47 | xargs hadoop fs -rm

感谢基思的灵感

答案 1 :(得分:4)

在Bash?

您想要保留哪些文件?为什么?他们的名字是什么?在上面的示例中,您可以执行以下操作:

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

将删除除part-1.gz,part-2.gz和part-3.gz之外的所有文件。

您也可以这样做:

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

除了列出的最后三个文件外,将删除所有文件。

你也可以这样做:

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

如果目录中有数百个文件,哪个更安全。

答案 2 :(得分: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的参数并非绝对必要,但在某些情况下可能会有所帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

awk:

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