在运行.sh中找不到这样的文件或目录

时间:2017-11-09 14:10:28

标签: python macos shell makefile terminal

在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:没有这样的文件或目录

为什么?

2 个答案:

答案 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 根据定义,
  • rm -f 不会失败;如果你的意思是|| true,那就太多了
  • thendo放在不同的行上,更易于阅读,以及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 ../