该脚本用于确定目标文件何时已存在,源文件将根据标志“$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 在 shell 中生成作业。将其视为:
bash -c 'the job'
您无法从中获取变量:
i=1
bash -c 'i=2'
# prints 1
echo $i
您将值添加到零件中的数组中bash -c
,这不会使其返回到父级。
但您也许可以更改脚本以便可以使用parset
.
# NB: parset will not work correctly if reading from a pipe
parset myresults dup_chk < dup_files.txt
然后对其进行一些后处理myresults
。