我有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
等相同。我想知道是否有办法在一个循环中浏览每个文件夹,而不是为每个文件夹编写一个循环。因为代码太笨重了。
答案 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
语句中编写目录参数,
我把它们放入一个数组中。
如果您有许多目录,这将更具可读性。
我还用现代`...`
替换了过时的$(...)
语法。