このスクリプトは、ターゲットファイルがすでに存在するタイミングを決定するために使用され、ソースファイルは "$dup_act"フラグに従ってターゲットファイルを更新または削除します。
#!/bin/bash
dup_chk()
{
# $1: f_src, $2: f_dest, $3: dup_act (keep file u/pdate, l/arge)
# check source file and destination file status
[[ "$3" = u && $(stat -c%Y "$1") -gt $(stat -c%Y "$2") || "$3" = l && $(stat -c%s "$1") -gt $(stat -c%s "$2") ]] \
&& echo -e "$1~$2~\n" >> mv_f.tmp || echo -e "$1\n" >> rm_f.tmp
# mv_f.tmp: a list of source file replace destination one
# rm_f.tmp: a list of source file to be removed
}
[[ -f mv_f.tmp ]] && rm mv_f.tmp ; [[ -f rm_f.tmp ]] && rm rm_f.tmp
dup_act=u # or dup_act=l
export dup_act
export -f dup_chk
cat dup_files.txt | parallel -j10 --no-run-if-empty --colsep '~' dup_chk {1} {2} "$dup_act"
出力ファイルが正しく生成されmv_f.tmp
ましたrm_f.tmp
。
スクリプトがファイルの代わりに変数を出力したいと思います。
#!/bin/bash
dup_chk()
{
# $1: f_src, $2: f_dest, $3: dup_act (keep file u/pdate, l/arge)
# check source file and destination file status
[[ "$3" = u && $(stat -c%Y "$1") -gt $(stat -c%Y "$2") || "$3" = l && $(stat -c%s "$1") -gt $(stat -c%s "$2") ]] \
&& mv_f+="$1~$2~\n" || || rm_f+="$1\n"
# mv_f: a variable of source file replace destination one
# rm_f: a variable of source file to be removed
}
mv_f= ; rm_f=
dup_act=u # or dup_act=l
export dup_act
export -f dup_chk
cat dup_files.txt | parallel -j10 --no-run-if-empty --colsep '~' dup_chk {1} {2} "$dup_act"
結果: $mv_f
変数$rm_f
が空です。
他の記事では、「環境変数は環境のエクスポート/継承の一部として親から子にのみ渡すことができ、その逆の場合は不可能です」と発見しました。これが理由ですか?
助けてください。ありがとうございます。
答え1
GNU Parallel はシェルからジョブを作成します。次のように考えてください。
bash -c 'the job'
以下では変数を取得できません。
i=1
bash -c 'i=2'
# prints 1
echo $i
part の配列に値を追加してもbash -c
親項目として返されることはありません。
ただし、機能するようにスクリプトを変更することもできますparset
。
# NB: parset will not work correctly if reading from a pipe
parset myresults dup_chk < dup_files.txt
その後、少し後処理を行いますmyresults
。