2017-02-05 2 views
1

У меня есть 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

Вместо один цикл за /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 заявлении Я помещал их в массив. Это будет более читаемым, если у вас много каталогов.

Я также заменил устаревший синтаксис `...` на современный $(...).

Смежные вопросы