![通过使用 shell 脚本使用修改日期进行过滤,将文件从 hdfs 文件夹复制到另一个 hdfs 位置](https://linux22.com/image/157263/%E9%80%9A%E8%BF%87%E4%BD%BF%E7%94%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%BD%BF%E7%94%A8%E4%BF%AE%E6%94%B9%E6%97%A5%E6%9C%9F%E8%BF%9B%E8%A1%8C%E8%BF%87%E6%BB%A4%EF%BC%8C%E5%B0%86%E6%96%87%E4%BB%B6%E4%BB%8E%20hdfs%20%E6%96%87%E4%BB%B6%E5%A4%B9%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%20hdfs%20%E4%BD%8D%E7%BD%AE.png)
我的 HDFS 位置中有 1 年的数据,我想将过去 6 个月的数据复制到另一个 HDFS 位置。是否可以直接从 hdfs 命令复制 6 个月的数据,还是需要编写 shell 脚本来复制最近 6 个月的数据?
我已经尝试过使用 hdfs 命令来执行此操作,但没有成功。
我尝试使用下面的 shell 脚本,它工作正常,直到创建 TempFile 但抛出错误
$ sh scriptnew.sh
scriptnew.sh: line 8: syntax error: unexpected end of file
并且脚本不会进一步执行。
下面是我使用的 shell 脚本。
#!/bin/bash
hdfs dfs -ls /hive/warehouse/data.db/all_history/ |awk 'BEGIN{ SIXMON=60*60*24*180; "date +%s" | getline NOW } { cmd="date -d'\''"$6" "$7"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-SIXMON; if(WHEN > DIFF){print $8}}' >> TempFile.txt
cat TempFile.txt |while read line
do
echo $i
hdfs dfs -cp -p $line /user/can_anns/all_history_copy/;
done
可能是什么错误以及如何解决这个问题?
答案1
要将 6 个月的文件从 hdfs 位置复制到另一个位置,我们可以使用以下脚本。
脚本应该从本地 Linux 位置运行。
#!/bin/bash
hdfs dfs -ls /hive/warehouse/data.db/all_history/ |awk 'BEGIN{ SIXMON=60*60*24*180; "date +%s" | getline NOW } { cmd="date -d'\''"$6" "$7"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-SIXMON; if(WHEN > DIFF){print $8}}' >> TempFile.txt
cat TempFile.txt |while read line
do
echo $i
hdfs dfs -cp -p $line /user/can_anns/all_history_copy/;
done
第 2 行:我们将最长 180 天的文件列表复制到 TempFile。然后我们遍历这个临时文件,如果找到匹配则复制该文件。
如果您从 Windows 编写脚本并复制到 Linux 机器,有时可能无法工作并显示语法错误。为了避免回车错误,将脚本复制到 Linux 机器本地路径后运行以下命令。 sed -i 's/\r//' 然后运行脚本>>>sh 文件名.sh