假设您有一个HDFS文件列表,其中包含一个公共前缀和一个递增后缀。例如,
part-1.gz, part-2.gz, part-3.gz, ..., part-50.gz
我只想在目录中留下一些文件,比如说3.任何三个文件都可以。这些文件将用于测试,因此文件的选择无关紧要。
什么是简单&删除其他47个文件的最快方法是什么?
答案 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
:
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