【问题标题】:Merge and compile SCSS files recursively using shell script in Windows在 Windows 中使用 shell 脚本递归地合并和编译 SCSS 文件
【发布时间】:2018-10-21 16:13:14
【问题描述】:

所以情况就是这样。我目前有以下文件夹结构的项目:

-- public_html
   -- assets
      -- scss (contains SCSS files, which can be located inside subfolders)
      -- scripts
         -- vendor 
            -- plugins (Also contain some SCSS files from the)
      -- css
      -- also some other folders (no scss or css here though)
   -- dist (distribution folder)
   -- other folders too for html, php etc...

当我想将脚本上传到我的远程服务器时,我首先将public_html中的完整文件夹结构处理为dist。我使用构建脚本build.sh 执行此操作,您可以在此处查看:

function prepareForBuild(){
    echo "Updating dependencies...";
    bower install

    echo "Preparing 'dist' directory...";
    mkdir -p dist
    rm -rf dist/*
    # for the * markup... */
}

function buildApp(){
    cd assets
    echo "Creating temp directory..."
    mkDir -p temp

    ## MERGING TAKES (OR SHOULD) PLACE HERE
    find "/" -name '*.scss' -exec cat {} \; > merge.scss


    cd ../
    pause
    # requirejs optimization
    echo "Optimizing files...";
    node r.js -o build/build.js
}

function cleanup(){
    echo "Cleaning up unnecessary files...";
    cd dist

    rm -f bower.json .gitignore .bowerrc README.md .DS_Store config.rb
    rm -f build.sh build.txt composer.json composer.lock
    rm -rf build dist scss .git .sass-cache .idea
}

function pause(){
   read -p "$*"
}

prepareForBuild
buildApp && cleanup 

echo "Building finished!";

问题:

但是,当我在 Git bash 终端中运行脚本时,它会在这一行中断:

find "/" -name '*.scss' -exec cat {} \; > merge.scss

编辑:“/”或“\”似乎不会影响问题:(
另外,从根 (public_html) 目录运行:

它在正常命令提示符“找不到文件 - *.scss”中返回(并输出一个空的 merge.scss 文件)并在 Git bash 终端中停止工作。 我将此行基于this 答案,但我无法让它为我工作。我也尝试了类似this 的方法,但这只会返回更多错误。 我在这里错过了什么?

编辑!

我认为 bash shell 只是停止工作,但似乎并非如此。过了一会儿,它返回这个: 这是什么意思?参考文件夹不正确吗?

目标:

如前所述,我想递归扫描资产文件夹中的 .scss 文件并将它们合并为一个 default.scss

如果这对于要求与require.js(或简单地与节点)集成的另一个解决方案来说太过分了,正如您在我的脚本中看到的那样,我已经使用require.js 进行标准优化。

感谢您的时间和耐心!

【问题讨论】:

  • 安装gentoo。
  • 不幸的是,这不是一个选择;)
  • 为什么要指定一个 REVERSE SOLIDUS(反斜杠)作为find '\' -name... 中的目录?那不应该是SOLIDUS(斜线,virgule)吗? find / -name...
  • @lit,感谢您的回复!不幸的是,这是一个错字,似乎不起作用:(老实说,我完全不知道这条线 atm 的问题是什么
  • 您发布的图像使您看起来像是在 cmd.exe shell 提示符下,而不是 bash shell 提示符下。 Windows find.exe 报告此错误消息。你需要启动一个 bash shell。

标签: node.js bash cmd sass requirejs


【解决方案1】:

如果要扫描资产目录下的文件,则不要在find 命令中指定根目录。省略目录也可能是个好主意。

find . -name "*.scss" -not -type d -exec cat {} \; > merge.scss

如果您希望在新创建的temp 目录中创建merge.scss 文件,则需要将其设为当前目录。然后您可以从父目录assets 进行文件扫描。

function buildApp(){
    cd assets
    echo "Creating temp directory..."
    mkDir -p temp

    ## MERGING TAKES (OR SHOULD) PLACE HERE
    cd temp
    find .. -name '*.scss' -not -type d -exec cat {} \; > merge.scss

    cd ../
    pause
    # requirejs optimization
    echo "Optimizing files...";
    node r.js -o build/build.js
}

另外,pause 命令在 bash shell 中是否适合您?这是一个 Windows 命令,除非你有别的东西。

【讨论】:

  • 您好,感谢您的回答! .. 修复了它之前给出的错误。但是,我现在收到merge.scss 既是输入文件又是输出文件的错误...这很奇怪,因为我 100% 确定还有其他文件需要添加。此外,暂停有效(我相信这不是 Windows 中的默认功能,而是我自己在脚本末尾的自定义功能)。 编辑: 有效!!!我在合并之前添加了一行来删除合并文件,现在它完全合并了!感谢您的帮助!
  • 您应该在被扫描的目录结构之外的某个位置创建merge.scss 文件,或者使用不同的文件扩展名。发生这种情况是因为它找到了merge.scss 并尝试将其写入merge.scss。也许>merge.scss.txt,然后mv merge.scss.txt merge.scss,如果这是你想要的名字。我在底部看到你pause 函数。
【解决方案2】:

您的 -exec 选项缺少 {} 特殊元素,这意味着文件匹配每个 find 迭代。此外,你不能明确地使用'\'作为根路径,至少它会是'/'。

尽管如此,理想情况下,您应该使用特定的子路径以提高效率,并出于权限访问的原因(我猜您的使用可能没有从根路径访问所有子路径的权限?)。

至少,您可以将指令更新为:

find '/' -type f -name "*.scss" -exec cat {} \; > merge.scss

【讨论】:

  • 嗨,Bsquare,感谢您的回答! \ 可能会链接到回收站或我猜的东西。确实,您对{} 部分是正确的,感谢您指出这一点!但是,脚本在这一行仍然停止工作,这可能是什么?
  • 我已经更新了我的问题,看来 shell 并没有崩溃。希望这有助于理解问题
  • 哈是的!您必须确保 find 指令只考虑文件。我编辑了我的答案,添加了“-type f”选项。出现您的错误是因为有一个名为“.scss”的目录(并且使用前面的命令,它试图 cat 目录,这是毫无意义的)。
  • 好的,我会试试那个,当我有结果的时候回来给你(它已经运行了一段时间了,不知道这样是否好,但我会再等一会儿)。另外,关于您在答案中提到的特定子路径。此命令在资产目录中运行(请参阅相关脚本)。无论如何,我会尽快通知您!
  • 仍然没有,脚本似乎只是停止了。有任何想法吗?编辑:Bash 没有输出,但 cmd 为行中的每个术语提供file not found '/'file not found -type