[英]How do I JS-Beautify recursively?
我在一个目录和子目录中有很多 HTML 文件。 我可以通过命令行执行js-beautify
命令,并希望将它递归地应用于所有这些文件。
我试过了
找 。 -name " .html" -type f | js-beautify -r
and
js-beautify -r | 找 。 -name " .html" -type f
但它不起作用。 但是,如果我给出类似js-beautify -r myfile.html
或js-beautify -r *.html
(如果是目录中的所有文件但不在子目录中),则 JS-beautify 确实有效
谁能告诉我应该如何管道这两个命令?
但是,JS-beautify 确实有效......如果所有文件都在目录中但不在子目录中
您已经提到如果所有输入文件都在同一目录中,则 JS-beautify 可以工作。 您的命令可能不起作用,因为您传递了find
所有结果,这些结果可能包括来自不同目录的输入文件。
正如前面评论中提到的,您可以使用-exec
代替:
find . -type f -name "*.html" -exec js-beautify -r {} \;
较新版本的 GNU find
可能使用以下语法:
find . -type f -name "*.html" -exec js-beautify -r {} +
我遇到了类似的问题,并使用glob-run找到了一个简单的跨平台解决方案:
npm i -g glob-run js-beautify
glob-run html-beautify -r **/*.html
不过,如果 js-beautify本身支持 globs那就太好了。
find+xargs 是要走的路。 它比使用 -exec 查找要快。
find . -name '*.html' | xargs js-beautify
如果由于某种原因,你的文件名中有空格,你会想要这样做......
find . -name '*.html' -print0 | xargs -0 js-beautify
最后,如果由于某种奇怪的原因,js-beautify 不能处理多个参数,那么您需要告诉 xargs 一次只传递一个参数。 这与使用 -exec 选项没有太大区别,但 IMO 更好,因为它更一致。
find . -name '*.html' | xargs -n 1 js-beautify
请注意,您可以将-print0
和xargs -0
选项与xargs -n 1
。
编辑:正如 TJ Crowder 所指出的,shell 不会在双引号中使用通配符。 这对我来说是个新闻,也许有一些古老的环境并非如此,希望你永远不会被迫在其中工作。
1)将这些依赖项添加到您的项目中
npm install --save-dev glob js-beautify
2) 创建scripts/format.js
const jsBeautify = require('js-beautify')['js_beautify'];
const fs = require('fs');
const glob = require('glob');
const options = {
indent_size: 2,
indent_char: ' ',
indent_with_tabs: false,
eol: '\n',
end_with_newline: true,
indent_level: 0,
preserve_newlines: true,
max_preserve_newlines: 10,
space_in_paren: false,
space_in_empty_paren: false,
jslint_happy: false,
space_after_anon_function: false,
brace_style: 'collapse',
break_chained_methods: false,
keep_array_indentation: false,
unescape_strings: false,
wrap_line_length: 0,
e4x: false,
comma_first: false,
operator_position: 'before-newline'
};
glob('**/!(node_modules)/**/*.js', { absolute: true }, (er, files) => {
files.forEach(file => {
console.log(`js-beautify ${file}`);
const data = fs.readFileSync(file, 'utf8');
const nextData = jsBeautify(data, options);
fs.writeFileSync(file, nextData, 'utf8');
});
});
3) 在package.json
添加format
脚本
"scripts": {
"format": "node ./scripts/format.js"
}
4)在你的项目中,运行
npm run format
结合上面比尔的智慧和这些关于正则表达式匹配的答案,这是我项目的实际解决方案:
找 。 -regextype egrep -regex './(src|test|app)/.*.(js|sass|html)' -print0 | xargs -0 ./node_modules/.bin/js-beautify -r
-r
)./node_modules/.bin
) 在 package.json 脚本中使用时, ./node_modules/.bin
自动在路径中, \\.*
需要转义为\\\\.*
,因此:
"beautify2": "find . -regextype egrep -regex './(src|test|app)/.*\\.(js|sass|html)' -print0 | xargs -0 js-beautify -r"
→
beautified app/index.html
beautified app/sass/_atomic.sass
beautified app/sass/_mixin.sass
beautified app/sass/space test.sass
beautified test/Log.test.js
beautified test/deleteAction.test.js
beautified src/util/fileUtils.js
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.