如何处理嵌套目录中的文件?

时间:2017-03-31 21:16:31

标签: bash

我试图让我的JavaScript文件变得更小。

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

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

这是我到目前为止的代码。理想情况下,我可以在npm脚本中执行此操作。如果它现在仅适用于Linux,那就太酷了。

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

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

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

2 个答案:

答案 0 :(得分:1)

要递归迭代,您可以在较新版本的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

答案 1 :(得分: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中自动创建新目录。 Haven没有测试过。

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