Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何从hdfs位置删除除一个以外的所有文件?_Shell_Hadoop_Hdfs - Fatal编程技术网

Shell 如何从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

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

我试过
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循环中删除文件快得多。