在osx上运行...
cd ${BUILD_DIR}/mydir && for DIR in $(find ./ '.*[^_].py' | sed 's/\/\//\//g' | awk -F "/" '{print $2}' | sort |uniq | grep -v .py); do
if [ -f $i/requirements.txt ]; then
pip install -r $i/requirements.txt -t $i/
fi
cd ${DIR} && zip -r ${DIR}.zip * > /dev/null && mv ${DIR}.zip ../../ && cd ../
done
cd ../
错误:
(env)➜shpackage_lambdas.sh find:。* [^ _]。py:没有这样的文件或目录
为什么?
答案 0 :(得分:1)
find(1)联机帮助页说它的args是[path ...] [expression]
,其中“expression”由“primaries”和“operands”(-flags)组成。 '.*[^-].py'
看起来不像任何表达式,因此它被解释为路径,并且报告工作目录中没有名为'.*[^-].py'
的文件。
也许你的意思是:
find ./ -regex '.*[^-].py'
答案 1 :(得分:1)
find 将要搜索的目录列表作为参数。你提供了似乎是正则表达式的东西。因为没有名为(字面意思).*[^_].py
的目录,所以find返回错误。
下面我修改了你的脚本以纠正错误(如果我理解你的意图)。因为我现在看到这么多写得不好的shell脚本,我已经冒昧地传统化#34;它。请查看您是否也发现它更具可读性。
的变化:
#!/bin/sh
,保证在类Unix系统上。比bash更快,除非(如OS X)它是bash。${var}
);在简单的情况下不需要它们/usr/bin/true
;如果您的意思是dev/null
根据定义,|| true
,那就太多了then
和do
放在不同的行上,更易于阅读,以及Bourne shell语言的使用方式&&
和||
作为续行,这样您就可以看到一步一步地发生了什么我建议的其他变化:
临时更改工作目录时使用子shell。当它终止时,工作目录会自动恢复(由父级保留),从而为您保存cd ..
步骤和错误。
使用set -e
导致脚本在出错时终止。对于预期的错误,请明确使用|| true
。
将grep .py
更改为grep '\.py$'
,只是为了更好的衡量标准。
为避免Tilting Matchstick Syndrome,请使用/
以外的其他内容作为 sed 替换分隔符,例如sed 's://:/:g'
。但awk -F '/+' '{print $2}'
可以完全避免 sed 。
修订版:
#! /bin/sh
src_dir=lambdas
build_dir=bin
mkdir -p $build_dir/lambdas
rm -rf $build_dir/*.zip
cp -r $src_dir/* $build_dir/lambdas
#
# The sed is a bit complicated to be osx / linux cross compatible :
# ( .//run.sh vs ./run.sh
#
cd $build_dir/lambdas &&
for L in $(find . -exec grep -l '.*[^_].py' {} + |
sed 's/\/\//\//g' |
awk -F "/" '{print $2}' |
sort |
uniq |
grep -v .py)
do
if [ -f $i/requirements.txt ]
then
echo "Installing requirements"
pip install -r $i/requirements.txt -t $i/
fi
cd $L &&
zip -r $L.zip * > /dev/null &&
mv $L.zip ../../ &&
cd ../
done
cd ../