问题:
js2coffe 仅适用于单个文件输入/输出重定向。 转换整个项目,它的目录结构可能是一个真正的痛苦。
想要转换 ExpressJS 默认应用项目,包括。它的目录结构?
查看下面的脚本
答案 0 :(得分:23)
更新:如果您赶时间,请查看以下此脚本的简短版本。
一个简单的Bash脚本执行Job for ya:
#!/bin/bash
for FILE in `find . -name "*.js" -type f -o -path './node_modules' -prune -o -path './components' -prune`
do
if [ -e $FILE ] ; then
COFFEE=${FILE//.js/.coffee}
echo "converting ${FILE} to ${COFFEE}"
js2coffee "$FILE" > "$COFFEE"
else
echo "File: {$1} does not exist!"
fi
done
创建一个文件,例如all2coffee,将它放在/ usr / local / bin中,在终端中添加chmod + x
标志
<强>要求强>
全局安装 js2coffee
,如果尚未安装,请执行:npm install -g js2coffee
SCRIPT EXPLAINED
for循环:
for FILE in `find arguments` ....
表示:
FILE
偶然发现.js文件时,将查找输出分配给find
字符串
查找参数:
-name "*.js"
抓取.js结尾的所有文件
-type f
必须是文件类型,因为我们不想要.js dir,但只有文件
-o -path './node_modules' -prune
排除目录 ./node_modules
中的文件,添加 -prune
至关重要,否则将会进入目录并打印 {{1在目录
阻止
*.js
-e 标记检查 if [ -e ${FILE} ] ; then
中的字符串是否是文件系统上的现有文件,否则执行FILE
。
字符串操作:
else
我们将COFFEE=${FILE//.js/.coffee}
变量作为我们替换的字符串
.js 与 .coffee 通过bash字符串操作:COFFEE
<强>转换:强>
${STRING//match_this/replace_with}
我们将带有js2coffee "$FILE" > "$COFFEE"
和FILE
的js2coffee作为字符串
<强> EXTRA:强>
您希望将所有已转换的.coffee文件移动到新目录,但保留结构?
在Linux中使用查找与 COFFEE
或在Os X上使用 rsync
,因为cp不会
创建此命令所需的目录。这里有一个要执行的小脚本
将完成这项工作的主要目录
所有.coffee文件都将在/ coffee目录中复制.js文件层次结构
ditto
执行此之后将文件转换为.coffee
<强>更新强>
您可以在第一次运行后与for FILE in `find . -name "*.coffee"`
do
ditto .${FILE/./} coffee${FILE/./}
done
交换ditto
或rsync
以移动文件,因为mv
mv
不会创建子目录。< / p>
更新2
按时为这些人添加一个衬垫,请参阅下面的第二个答案!
更新3
为那些不想转换其依赖项的人添加了一个从转换中排除cp
目录的选项
答案 1 :(得分:9)
对于那些短时间内的人 - 使用这个漂亮的单行!
它是从当前目录开始的./并通过子目录
将每个.js
文件磨成.coffee
find . -type f -name '*.js' | while read f; do echo "grinding $f to ${f/.js/.coffee} "; js2coffee "$f" > "${f/.js/.coffee}"; done
想从转换中排除 ./node_modules
目录吗?请改用下面的代码:
find . -path ./node_modules -prune -o -type f -name '*.js' | while read f; do echo "grinding $f to ${f/.js/.coffee} "; js2coffee "$f" > "${f/.js/.coffee}"; done
小提示:
您也可以使用此循环来移动或复制文件:
用你需要做的任何事情替换 js2coffee 命令。
可以简单地修改和过滤find
输出(找到的文件列表)。
在bash中,子字符串提取(或替换)很简单 - 如上例所示:
重要(长版) 可以通过在变量名称前面添加 $ 来访问bash变量 - 但最初它们被定义为而不是 $ ,所以为了您的心理健康保持记住并检查代码中的$ var / var =语法,以防出现一些不那么逻辑的错误。我没有在Bash做任何事情一段时间后一遍又一遍地犯这个错误所以我认为分享这个简单的事实是明智的(也可能是我,是一个糟糕的开发者)
重要(简短版本)变量定义:var_name=value
变量访问权限:$var_name=value
,不明智:$var_name=value
,稍后由$var_name
访问。
在示例中,变量 f 由 $ f 访问,访问 $ {f} 我们替换 .js < / strong> - &gt; .coffee - &gt; /.js
(/是分隔符) /.coffee
是这样的:${f/.js/.coffee}
。
apple="green";
echo $apple;
输出:
green