Bash 使用文件名的一部分作为字段/列添加

Bash 使用文件名的一部分作为字段/列添加,bash,for-loop,hadoop,filenames,hdfs,Bash,For Loop,Hadoop,Filenames,Hdfs,我每天(通过wget)都会收到5个保存到/tmp的文件,然后用bash脚本加载到hdfs中。 donaldDuck-2013-07-20.zip 米老鼠-2013-07-20.zip goofyGoof-2013-07-20.zip 冥星-2013-07-20.zip bigBadWolf-2013-07-20.zip 文件名的日期部分是动态的。 然后,我如何告诉hadoop将5个文件中的每一个加载到中?我听说了一个环路 for file in /tmp/*; do echo "Running

我每天(通过wget)都会收到5个保存到/tmp的文件,然后用bash脚本加载到hdfs中。 donaldDuck-2013-07-20.zip
米老鼠-2013-07-20.zip
goofyGoof-2013-07-20.zip
冥星-2013-07-20.zip
bigBadWolf-2013-07-20.zip

文件名的日期部分是动态的。 然后,我如何告诉hadoop将5个文件中的每一个加载到中?我听说了一个环路

for file in /tmp/*; do
echo "Running ${file##*/} ...."
done

我是否用“hadoop fs-put…”语句替换回显行?它看起来怎么样?

您可以执行以下操作:

#!/bin/bash

when=$(date "+%Y-%m-%d") #output like 2013-07-23
names=(donaldDuck mickeyMouse goofyGoof plutoStar bigBadWolf)

for file in "${names[@]}"
do
        ls -l $file-$when.zip #output like donaldDuck-2013-07-23.zip
done
解释
名称存储在数组
$names
中。因此,我们可以对“${names[@]}”中的文件使用
循环遍历它。同时,我们将日期存储在
$when
中,以便格式与
$file-$when.zip
相匹配。下面是我要做的:

hdfsdir=/path/to/hdfs/output/dir
datethru=`date "+%Y-%m-%d" --date="3 days ago"` # replace by how many days ago you want
for i in `ls /tmp/*-$datethru.zip`; do
    hadoop fs -put $i $hdfsdir
done

这将基本上抓取目录中包含特定日期并以.zip结尾的所有文件,并将这些文件中的每个文件上载到hdfs中的特定目录。

i in/tmp/*-$datethru.zip中的
与ls解析输出相比更安全、更干净。