我想从hdfs位置删除所有文件,除了一个,但是找不到任何解决方案。
我尝试过shopt -s extglob
,然后hadoop fs -rm location/!(filename)
但这没用。
答案 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