Linux命令行中Hadoop无法用正则表达式删除指定日期目录问题
解决HDFS中批量删除指定日期子目录的问题
问题原因
Linux终端的shell只会解析本地文件系统的通配符(比如*[21-25]),而HDFS路径不属于本地文件系统,shell不会对其进行通配符扩展,会直接把*[21-25]当作字面量路径传递给hdfs dfs命令,导致HDFS找不到这个不存在的目录,从而报错。另外,你用的*[21-25]写法本身也有问题:[21-25]是单个字符的匹配集合,实际会匹配结尾是1、2、3、4、5的目录,和你要删除21-25日目录的需求不符。
解决方法
方法1:使用HDFS支持的正确Glob模式
HDFS的hdfs dfs命令支持Glob模式匹配,针对你的目录格式(比如2018-12-21),可以直接用以下命令匹配并删除目标目录:
hdfs dfs -rm -r /home/cloudera/logs/2018-Dec/2018-12-2[1-5]
解释:2[1-5]精准匹配最后两位是21、22、23、24、25的目录,HDFS会直接解析这个模式,不需要shell提前扩展。
方法2:通过管道批量筛选并删除(直观易验证)
如果不确定Glob模式是否正确,可以先筛选出目标目录再执行删除,适合新手确认要删的内容:
hdfs dfs -ls /home/cloudera/logs/2018-Dec/ | grep "2018-12-2[1-5]" | awk '{print $8}' | xargs hdfs dfs -rm -r
步骤说明:
hdfs dfs -ls列出指定路径下的所有目录grep筛选出21-25日的目录行awk '{print $8}'提取目录的完整路径(ls输出的第8列是路径)xargs把筛选出的路径传递给删除命令执行操作
方法3:逐个指定目录删除(最稳妥)
如果目录数量不多,也可以直接逐个指定路径删除,避免匹配错误:
hdfs dfs -rm -r /home/cloudera/logs/2018-Dec/2018-12-21 /home/cloudera/logs/2018-Dec/2018-12-22 /home/cloudera/logs/2018-Dec/2018-12-23 /home/cloudera/logs/2018-Dec/2018-12-24 /home/cloudera/logs/2018-Dec/2018-12-25
验证建议
执行删除前,先用hdfs dfs -ls命令验证匹配的目录是否正确,比如:
hdfs dfs -ls /home/cloudera/logs/2018-Dec/2018-12-2[1-5]
如果能列出你要删除的目录,再执行删除命令更安全。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

