如何使脚本适用于不同的文件?

时间:2017-02-05 07:05:35

标签: bash hadoop hive

我有2个脚本。首先,start.sh有以下几行:

echo "-----------RUN copy mta-------------"
bash copy_file.sh mta $today_without_dash
echo "-----------RUN copy rcr-------------"
bash copy_file.sh rcr $today_without_dash
echo "-----------RUN copy sub-------------"
bash copy_file.sh sub $today_without_dash

copy_file.sh开始:

echo "remove old files "${1}
hadoop fs -rm -skipTrash /apps/hive/warehouse/database.db/project/file_${1}/*

for i in `hadoop fs -ls /user/files/${2}_C | egrep ${1}.gz | awk -F " " '{print $8}'`
do
    hadoop fs -cp $i /apps/hive/warehouse/database.db/project/file_${1}
    echo "copy file - "${i}
done

for i in `hadoop fs -ls /user/files/${2}_B | egrep ${1}.gz | awk -F " " '{print $8}'`
do
    hadoop fs -cp $i /apps/hive/warehouse/database.db/project/file_${1}
    echo "copy file - "${i}
done

问题是,我有很多这些${2}_C类型的文件夹,每个文件夹都以不同的字母结尾。与${2}_P${2}_F${2}_L等相同。我想知道是否有办法在一个循环中浏览每个文件夹,而不是为每个文件夹编写一个循环。因为代码太笨重了。

1 个答案:

答案 0 :(得分:1)

而不是每个/user/files/${2}_SOMELETTER一个循环, 您可以对参数列表中的所有目录使用一个循环,例如:

dirs=(/user/files/${2}_C /user/files/${2}_B)

for i in $(hadoop fs -ls "${dirs[@]}" | egrep ${1}.gz | awk -F " " '{print $8}')
do
    hadoop fs -cp $i /apps/hive/warehouse/database.db/project/file_${1}
    echo "copy file - "${i}
done

请注意,不是在for语句中编写目录参数, 我把它们放入一个数组中。 如果您有许多目录,这将更具可读性。

我还用现代`...`替换了过时的$(...)语法。