使用 Windows 中的 shell 脚本递归合并和编译 SCSS 文件

Merge and compile SCSS files recursively using shell script in Windows

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

-- 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 Whosebug 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) 目录:

它 returns 在正常的命令提示符 "File not found - *.scss" 中(并输出一个空的 merge.scss 文件)并在 Git bash 中停止工作终端。 我将这一行基于 this answer, but I can't get it to work for me. I also tried something like this 而不是,但这只会 returns 更多错误。 我在这里错过了什么?

编辑!

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

Objective:

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

如果这太难问了,另一个与 require.js(或简单地与节点)集成的解决方案也是可能的,正如您在我的脚本中看到的那样,我已经使用 require.js 进行标准优化.

感谢您的耐心等待!

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

然而,理想情况下,您应该使用特定的子路径以获得更高的效率,并且出于权限访问的原因(我猜您的使用可能没有权限从根路径访问所有子路径?)。

至少,您可以将说明更新为:

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

如果要扫描assets目录下的文件,那么在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 命令,除非你有别的东西。