如何从hdfs位置中删除除一个以外的所有文件?

时间:2019-10-22 12:20:48

标签: shell hdfs

我想从hdfs位置删除所有文件,除了一个,但是找不到任何解决方案。

我尝试过shopt -s extglob,然后hadoop fs -rm location/!(filename) 但这没用。

3 个答案:

答案 0 :(得分:2)

最好的选择是将特定文件复制到其他目录,然后删除目标目录中的所有其余文件,然后将特定文件移至同一目录。

否则,还有两种其他方法可以完成相同的事情。

下面是一个示例shell脚本,用于删除所有需要一种匹配模式的文件。

#!/bin/bash
echo "Executing the shell script"

for file in $(hadoop fs -ls /user/xxxx/dev/hadoop/external/csvfiles |grep -v 'a_file_pattern_to_search' | awk '{print $8}')
do
    printf '\n' >> "$file"
    hadoop fs -rm "$file"
done
echo "shell scripts ends"

列出所有文件,然后将grep与-v选项一起使用,以获取除特定模式或文件名以外的所有文件。

答案 1 :(得分:0)

使用以下代码,我可以立即从hdfs位置删除所有文件,但所需文件除外。

file_arr=()
for file in $(hadoop fs -ls /tmp/table_name/ | grep -v 'part-' | awk '{print $8}')
do
    file_arr+=("$file")
done
hadoop fs -rm "${file_arr[@]}"  

答案 2 :(得分:0)

我在 vikrant Rana 的解决方案之后想出了一个解决方案。它不需要多次执行 rm 命令,也不需要将文件存储在任何数组中,减少 loc 和工作量:

hadoop fs -ls /user/xxxx/dev/hadoop/external/csvfiles| grep -v 'a_file_pattern_to_search'  | awk '{print $8}' | xargs hadoop fs -rm