Shell 如何从hdfs位置删除除一个以外的所有文件?
我想从hdfs位置删除除一个以外的所有文件,但找不到任何解决方案 我试过Shell 如何从hdfs位置删除除一个以外的所有文件?,shell,hadoop,hdfs,Shell,Hadoop,Hdfs,我想从hdfs位置删除除一个以外的所有文件,但找不到任何解决方案 我试过shopt-s extglobhadoop fs-rm location/!(文件名) 但它不起作用。最好的选择是将特定文件复制到其他目录,删除目标目录中的所有剩余文件,然后将特定文件移动到同一目录 除此之外,还有其他几种方法可以做同样的事情 下面是一个示例shell脚本,用于删除除一个匹配模式之外的所有文件 #!/bin/bash echo "Executing the shell script" for file in
shopt-s extglob
hadoop fs-rm location/!(文件名)
但它不起作用。最好的选择是将特定文件复制到其他目录,删除目标目录中的所有剩余文件,然后将特定文件移动到同一目录 除此之外,还有其他几种方法可以做同样的事情 下面是一个示例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 with-v选项,该选项可获取除特定模式或文件名以外的所有文件。使用以下代码,我可以一次从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[@]}"
我根据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
为什么不将此文件移到另一个位置,然后在删除其他文件后复制回原始位置谢谢您的回复。这种方法是可能的,但我必须在hdfs中的100多个表位置上执行此操作。因此,这种方法将更加耗时。感谢@vikrant rana的响应。代码工作正常,但上面的代码更耗时,因为它将对每个文件而不是所有不需要的文件运行
hadoop fs-rm
命令。位置中有2000多个文件。上面的代码将对每个不需要的文件执行hadoop fs-rm
命令。是否可以在hadoop fs-rm
中提供任何模式来删除文件,除了一个之外?@kishorahire在hadoop fs-rm中不可能使用负模式,而不是逐个删除文件。我在for循环之前创建了一个数组,并将所有结果附加到该数组中。在for循环完成后,我在整个阵列上执行了hadoop fs-rm
命令。现在,它比在for循环中删除文件快得多。