Hadoopでファイル名のみを取得するコマンド/式があることを知りたいです。ファイル名を取得する必要があるのは、hadoop fs -ls
パス全体を出力します。
私は以下を試しましたが、それを行うためのより良い方法があれば疑問に思います。
hadoop fs -ls <HDFS_DIR>|cut -d ' ' -f17
hadoop lsはファイル名だけを出力するオプションをサポートしていません 、または最後の列だけをサポートしているようです。
最後の列を確実に取得したい場合は、最初に空白を単一のスペースに変換して、最後の列をアドレス指定できるようにする必要があります。
_hadoop fs -ls | sed '1d;s/ */ /g' | cut -d\ -f8
_
これにより、最後の列だけでなく、パス全体のファイルが取得されます。ファイル名だけが必要な場合は、@ rojomokeが示唆するようにbasenameを使用できます。
_hadoop fs -ls | sed '1d;s/ */ /g' | cut -d\ -f8 | xargs -n 1 basename
_
_Found ?x items
_という最初の行も除外しました
注:コメントの@ felix-frankのメモのように、上記のコマンドは複数の連続したスペースを持つファイル名を正しく保存しないことに注意してください。したがって、Felixが提案するより正確なソリューション:
hadoop fs -ls /tmp | sed 1d | Perl -wlne'print +(split " ",$_,8)[7]'
次のコマンドは、ファイル名のみを返します。
hdfs dfs -stat "%n" my/path/*
これが誰かの助けになることを願っています-バージョン2.8.x +(3でも利用可能)-
hadoop fs -ls -C /paths/
hadoop fs -ls -C /path/* | xargs -n 1 basename
私がよく使用するもう1つのソリューション。関連するものはほとんどありません。
Found x items
なしでのみファイルとディレクトリをリストしますhdfs dfs -ls -d mypath/*
hdfs dfs -ls -d mypath/* | awk '{print $8}'
hdfs dfs -ls -d mypath/* | awk '{print $8}'| while read fn; do basename $fn; done
hdfs dfs -ls -d {my,his}path/*.{txt,doc}
Basenameコマンドを使用します。このコマンドは、文字列から「/」で終わるプレフィックスを取り除きます。
basename $(hadoop fs -ls)
Belowコマンドは、ディレクトリ内のファイル名のみを返します。 Awkリストを「/」で分割し、ファイル名になる最後のフィールドを出力します。
hdfs dfs -ls /<folder> | awk -F'/' '{print $NF}'