我想编译包含在目录层次结构中的文件。像这样:tree src
src
├── dir0
│ ├── subdir1
│ │ ├── srcfile0.lang
│ │ ├── srcfile1.lang
│ │ └── srcfile2.lang
│ ├── subdir3
│ │ ├── srcfile0.lang
│ │ ├── srcfile1.lang
│ │ ├── srcfile2.lang
│ │ └── subsubdir10
│ │ ├── srcfile100.lang
│ │ └── srcfile102.lang
│ └── subdir4
│ ├── srcfile0.lang
│ ├── srcfile1.lang
│ ├── srcfile2.lang
│ └── subsubdir11
│ ├── srcfile101.lang
│ └── srcfile102.lang
├── dir1
│ ├── subdir1
│ │ ├── srcfile0.lang
│ │ ├── srcfile1.lang
│ │ └── srcfile2.lang
│ ├── subdir3
│ │ ├── srcfile0.lang
│ │ ├── srcfile1.lang
│ │ ├── srcfile2.lang
│ │ └── subsubdir11
│ │ ├── srcfile100.lang
│ │ └── srcfile101.lang
│ └── subdir4
│ ├── srcfile0.lang
│ ├── srcfile1.lang
│ ├── srcfile2.lang
│ └── subsubdir10
│ ├── srcfile100.lang
│ └── srcfile102.lang
├── dir2
│ ├── subdir0
│ │ ├── srcfile0.lang
│ │ └── srcfile2.lang
│ └── subdir3
│ ├── srcfile0.lang
│ └── srcfile1.lang
├── srcfile06.lang
├── srcfile07.lang
└── srcfile08.lang
16 directories, 33 files
每个文件都独立于其他文件。我想在另一个名为“build”的目录中编译这个层次结构,如下所示:tree build
build
├── dir0
│ ├── subdir1
│ │ ├── srcfile0.lang.out
│ │ ├── srcfile1.lang.out
│ │ └── srcfile2.lang.out
│ ├── subdir3
│ │ ├── srcfile0.lang.out
│ │ ├── srcfile1.lang.out
│ │ ├── srcfile2.lang.out
│ │ └── subsubdir10
│ │ ├── srcfile100.lang.out
│ │ └── srcfile102.lang.out
│ └── subdir4
│ ├── srcfile0.lang.out
│ ├── srcfile1.lang.out
│ ├── srcfile2.lang.out
│ └── subsubdir11
│ ├── srcfile101.lang.out
│ └── srcfile102.lang.out
├── dir1
│ ├── subdir1
│ │ ├── srcfile0.lang.out
│ │ ├── srcfile1.lang.out
│ │ └── srcfile2.lang.out
│ ├── subdir3
│ │ ├── srcfile0.lang.out
│ │ ├── srcfile1.lang.out
│ │ ├── srcfile2.lang.out
│ │ └── subsubdir11
│ │ ├── srcfile100.lang.out
│ │ └── srcfile101.lang.out
│ └── subdir4
│ ├── srcfile0.lang.out
│ ├── srcfile1.lang.out
│ ├── srcfile2.lang.out
│ └── subsubdir10
│ ├── srcfile100.lang.out
│ └── srcfile102.lang.out
├── dir2
│ ├── subdir0
│ │ ├── srcfile0.lang.out
│ │ └── srcfile2.lang.out
│ └── subdir3
│ ├── srcfile0.lang.out
│ └── srcfile1.lang.out
├── srcfile06.lang.out
├── srcfile07.lang.out
└── srcfile08.lang.out
16 directories, 33 files
当我有了第一个层次结构时,我希望有最后一个层次结构,其中所有可编译文件都编译并存储在“构建”层次结构中。
我写了这个剧本来做这件事。cat mycompiler
#!/usr/bin/env sh
CURRENTDIR="$(dirname -- \""$(readlink -f \""${O}\"")\"")"
SRCDIR="${1:-$CURRENTDIR}"
BUILDDIR="$(dirname \""${SRCDIR}\"")/build"
# compile build hierarchy
COMPILER="cat"
OPTION=""
INPUTEXT=".lang"
OUTPUTSUCCESSEXT=".out"
OUTPUTFAILUREEXT=".log"
compile () {
f="${1}"
dir=$(dirname -- "${f}" | sed "s#${SRCDIR}#${BUILDDIR}#")
mkdir -p "${dir}"
success=$(echo "${f}" | sed "s#${SRCDIR}#${BUILDDIR}#;s#\(${INPUTEXT}\)#\1${OUTPUTSUCCESSEXT}#")
failure=$(echo "${f}" | sed "s#${SRCDIR}#${BUILDDIR}#;s#\(${INPUTEXT}\)#\1${OUTPUTFAILUREEXT}#")
#echo "${COMPILER} ${f} >${success} 2>${failure}"
"${COMPILER}" "${OPTION}" "${f}" >"${success}" 2>"${failure}"
}
find "${SRCDIR}" -type f -iname "*${INPUTEXT}" | while IFS= read -r f
do
compile "${f}" &
done
find "${BUILDDIR}" -type f -iname "*${OUTPUTFAILUREEXT}" -empty -exec rm {} \;
exit 0
由于文件是独立的,我希望它并行发生,以加快进程,但只在while循环中。
脚本的最后两个命令(见下文)需要等待所有后台任务完成。
find "${BUILDDIR}" -type f -iname "*${OUTPUTFAILUREEXT}" -empty -exec rm {} \;
exit 0
有谁能帮我改进我的剧本吗?
谢谢!
1条答案
按热度按时间kadbb4591#
使用
wait
等待所有后台作业完成的通常方法被函数compile()隐藏。这会使代码变得很难看,但是如果将compile()的内容拉入主脚本,执行
wait
就可以了。和:
sh
和bash
的某些版本要求使用set -m
显式打开作业控制