使用Shell脚本查找HDFS中的文件是否存在

11

我有一个像下面这样的shell脚本。这个脚本会打印出位于HDFS中的文件路径。

#!/bin/bash

TIMESTAMP=`date "+%Y-%m-%d"`
path=/user/$USER/logs/${TIMESTAMP}.fail_log
path1=/user/$USER/logs/`date -d "-1 days" '+%Y-%m-%d'`.fail_log

echo filePath=$path
echo filePath1=$path1

在脚本中提供的pathshdfs位置。

在这个脚本中,我正在获取文件路径。

现在我想知道文件在HDFS中是否存在。

如果文件存在,则仅打印文件路径,否则不执行任何操作。

我该如何实现?

2个回答

29

您可以尝试使用-test选项来实现相同的效果。

hdfs dfs -test -[defszrw] HDFS_PATH
  • -d: 如果路径是目录,则返回0。
  • -e: 如果路径存在,则返回0。

自2.7.0版本以来

  • -f: 如果路径是文件,则返回0。
  • -s: 如果路径不为空,则返回0。
  • -r: 如果路径存在且具有读取权限,则返回0。

自2.8.0版本以来

  • -w: 如果路径存在且具有写入权限,则返回0。
  • -z: 如果文件大小为零,则返回0。

示例:

if hdfs dfs -test -e $HDFS_PATH; then
    echo "[$HDFS_PATH] exists on HDFS"
    hdfs dfs -ls $HDFS_PATH
fi

参考文献:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html#test


2
你测试过代码了吗?因为我只能使用 echo $? 并将其与 0 进行比较来获取值。 - Shikkou
存在则返回0;echo "[$HDFS_PATH] 在HDFS上不存在"需要加上not - seunggabi

2
path=hdfs://a/b/c

hdfs dfs -test -e ${path}
if [ $? -eq 0 ]; then
    echo "exists !!!"
fi

hdfs dfs -test -z ${path}
if [ $? -eq 0 ]; then
    echo "zero !!!"
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接