【问题标题】:How to process files in nested directories?如何处理嵌套目录中的文件?
【发布时间】:2017-04-02 04:11:26
【问题描述】:

我正在尝试使我的 JavaScript 文件更小一些。

我有一个javascripts/ 目录,然后是一个_website/javascripts/ 目录,用于编译我的静态资产。在javascripts/ 目录中,我有一些用于polyfill、库等的嵌套目录,然后是我的站点的文件。

我如何递归地遍历javascripts/ 的所有嵌套目录并将缩小、压缩但未连接的文件抽出到我的_website/javascripts/ 目录中?

这是我到目前为止的代码。理想情况下,我可以在 npm 脚本中执行此操作。如果它现在只能在 Linux 上运行,那就太棒了。

find scripts/ -name '*.js' -print0 | xargs -0 uglifyjs

然后我不知道如何将输入作为 uglifyjs 的 --output 标志的名称传递给每个 xargs 执行。

如何使用 xargs 执行此操作?是 {} 概念吗?

【问题讨论】:

    标签: bash


    【解决方案1】:

    这就是我最终这样做的方式:

    find javascripts/ -name '*.js' -print0 | xargs -0 -I file uglifyjs file -o _website/file

    所以,find 会四处查看javascripts/ 中的所有内容。每次它找到名称以.js 结尾的东西时,它都会将其写入STDOUT。 | 接受这些写入并将它们发送到 xargs

    (find 上的-print0 标志确保不添加新行或额外空格。xargs 上的-0 标志确保处理 find 的每个完整输出,即使文件名有新行或空格并且这样的。)

    -I file 创建一个变量file,它保存从find 命令的每个输出中获得的文件名。然后我们使用uglifyjs file -o _website/file 中的那个变量对每个js 文件运行uglify 并将它放到我们编译的网站目录_website 的适当位置。小提示:这可能不会自动在_website/javascripts 中创建新目录。没有测试过。

    祝所有来到这里的人好运!

    【讨论】:

    • 您可能想查看find-exec 操作,而不是管道到另一个程序...
    • 我得到了find: missing argument to -exec'`find scripts/ -name '*.js' -exec uglifyjs {} -c -o _site/{} 如何替换调用的 uglify 部分中的文件名?
    • 把`\;`放在它的末尾(空格反斜杠分号)
    • 哇哦!那就更好了:)
    【解决方案2】:

    要递归迭代,您可以在较新版本的 bash 上使用 globstar 选项:

    #!/bin/bash
    shopt -s globstar
    shopt -s nullglob
    
    for file in javascripts/**/*.js
    do
        name=$(basename "$file")
        uglifyjs "$file" > "_website/javascripts/$name"
    done
    

    另外,您在 do 之前缺少了一个分号(如果您的代码在一行上,则这是必需的)并且在末尾缺少了 done

    【讨论】:

    • 将我的代码更新为find scripts/ -name '*.js' -print0 | xargs -0 uglifyjs,但不确定如何访问 xargs 的每个输入,以便我可以指定要输出的文件。
    • 我的回答有问题吗?它不适合你吗?我注意到我刚刚修正了一个错字。
    • 这是一个很好的答案!我只是认为我的 bash 语法知识有限。有多个星样震颤。我需要并在一条线上回答,但我不太确定如何转换你的。我去别处寻找并混合了我学到的一堆不同的东西,并测试了我在答案中列出的方法。
    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2012-02-08
    • 2017-04-15
    • 1970-01-01
    相关资源
    最近更新 更多