1

次の行を含むbashスクリプトがあります

for file in $diff_file_list
    do

        # replace any ? with $current_date and replace any % with $file
        formatted_output_filename=$(echo $output_filename | sed "s|?|$current_date|g" | sed "s|%|_$file|g")
        $pig_bin_dir/pig -param preceding=$hdfs_hadoop_pre_dir/$file -param current=$hdfs_hadoop_cur_dir/$file -param output_added=$hdfs_hadoop_delta_dir/${file}_added -param output_removed=$hdfs_hadoop_delta_dir/${file}_removed -param delimiter=$delimiter diff.pig
        [ $? -ne 0 ] && die "diff of data between $previous_date and $current_date using pig failed. exiting `basename $0` script"
        $hadoop_bin_dir/hadoop dfs -cat $hdfs_hadoop_delta_dir/${file}_added/* | gzip > $file_output_dir/${formatted_output_filename}_added.gz
        $hadoop_bin_dir/hadoop dfs -cat $hdfs_hadoop_delta_dir/${file}_removed/* | gzip > $file_output_dir/${formatted_output_filename}_removed.gz
        [ $? -ne 0 ] && die "there was a problem gzipping ${formatted_output_filename}. exiting `basename $0` script"
        [ $post_diff_script ] && ./$post_diff_script $source $previous_date $current_date

    done

ファイルが空でない場合にのみ、_removed.gz および _added.gz ファイルを作成したいと考えています。以下でこれを実行しようとしましたが、スクリプトに何か問題がありますか?

    for file in $diff_file_list
    do

        # replace any ? with $current_date and replace any % with $file
        formatted_output_filename=$(echo $output_filename | sed "s|?|$current_date|g" | sed "s|%|_$file|g")
        $pig_bin_dir/pig -param preceding=$hdfs_hadoop_pre_dir/$file -param current=$hdfs_hadoop_cur_dir/$file -param output_added=$hdfs_hadoop_delta_dir/${file}_added -param output_removed=$hdfs_hadoop_delta_dir/${file}_removed -param delimiter=$delimiter diff.pig
        [ $? -ne 0 ] && die "diff of data between $previous_date and $current_date using pig failed. exiting `basename $0` script"
        if [[ -s $hdfs_hadoop_delta_dir/${file}_added/* ]] ; then
        echo "$hdfs_hadoop_delta_dir/${file}_added/* has data."
        $hadoop_bin_dir/hadoop dfs -cat $hdfs_hadoop_delta_dir/${file}_added/* | gzip > $file_output_dir/${formatted_output_filename}_added.gz
        $hadoop_bin_dir/hadoop dfs -cat $hdfs_hadoop_delta_dir/${file}_removed/* | gzip > $file_output_dir/${formatted_output_filename}_removed.gz
        else
        echo "$hdfs_hadoop_delta_dir/${file}_added/*is empty."
        fi ;
        [ $? -ne 0 ] && die "there was a problem gzipping ${formatted_output_filename}. exiting `basename $0` script"
        [ $post_diff_script ] && ./$post_diff_script $source $previous_date $current_date

    done
4

2 に答える 2

2
if [[ -s file ]]
then
    do_file_creation
fi

また

for f in dir/*
do
    if [[ -s $f ]]
    then
        do_file_creation
    fi
done

小文字または大/小文字混合の変数名を使用します。

ifの代わりに使用[[ ]] &&

インデントを使用します。

于 2012-05-29T15:14:20.247 に答える
0

ループを追加しない解決策を見つけようとしました。ただし、それほどきれいではありません。

if [[ -s `ls -S $hdfs_hadoop_delta_dir/${file}_added/* 2>/dev/null | head -1` ]] ; then

ls -Sはファイル サイズでファイルを並べ替えhead -1、最大のものを取得しますif [[ -s

残念ながら、ファイルがない場合を処理する必要があります。使用し2>/dev/nullました。誰でも良いアイデアがありますか?

于 2012-05-29T16:10:52.927 に答える