2017-05-10 9 views
1

私は以下のようにshell scriptを持っています。このスクリプトは、提供pathsは、私はファイルパスを取得しています。このスクリプトでhdfs場所シェルスクリプトを使用してHDFSにファイルが存在するかどうかを調べる

あるスクリプトで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 

にあるファイルのパスを出力します。

今、ファイルが実際に存在するかどうかをHDFSに知りたいと思います。

ファイルが存在する場合は、ファイルパスのみを出力するか、何もしないでください。

どうすればいいですか?

+0

Ambrishの答え@あたりとして、HDFS_PATHファイルがHDFS上に存在する場合にのみ印刷されます。私はそれを試して、それは正常に動作します。 – daemon12

答えて

5

これを実現するには、-testオプションを試してみてください。

hdfs dfs -test -[ezd] HDFS_PATH 
  • -e:ファイルまたはディレクトリが
  • -zが存在するかどうかを確認するには、次のファイルまたはディレクトリが
  • -d空であるかどうかを確認するには:与えられたHDFS_PATHがディレクトリであるかどうかを確認するには。

例:

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/r2.4.1/hadoop-project-dist/hadoop-common/FileSystemShell.html#test

+0

編集した質問をご覧ください。私はあなたの提案で更新しました –

+0

'/ user/$ USER/logs/$ {TIMESTAMP} .fail_log'がHDFSに存在するかどうかチェックしましたか? 'hdfs dfs -ls/user/$ USER/logs/$ {TIMESTAMP} .fail_log'を実行してみてください。 – Ambrish

0

は、テストの複数の方法がありますが、bashで、あなたが使用可能な条件式[[read here for more info)を、使用する必要がありますどちらか-e(存在する場合、ファイルまたはディレクトリまたは特殊のいずれか)または-f(ファイルです)、そうですね:

# as a oneline test 
[[ -f $path ]] && echo "the file $path exists" 
# or as a if-then expression 
if [[ -e $path ]]; then 
    echo "the path $path exists" 
fi 
関連する問題