[英]How do I JS-Beautify recursively?
I have lots of HTML files in a directory and sub-directories.我在一个目录和子目录中有很多 HTML 文件。 I can execute
js-beautify
command through the command line and want to apply it recursively to all those files.我可以通过命令行执行
js-beautify
命令,并希望将它递归地应用于所有这些文件。
I have tried我试过了
find .
找 。 -name " .html" -type f |
-name " .html" -type f | js-beautify -r
and
js-beautify -r |js-beautify -r
and
js-beautify -r | find .找 。 -name " .html" -type f
-name " .html" -type f
but it doesn't work.但它不起作用。 However, JS-beautify does work if I give something like
js-beautify -r myfile.html
or js-beautify -r *.html
(in case of all the files in a directory but not in sub-directory )但是,如果我给出类似
js-beautify -r myfile.html
或js-beautify -r *.html
(如果是目录中的所有文件但不在子目录中),则 JS-beautify 确实有效
Can anyone tell me how should I be piping these two commands?谁能告诉我应该如何管道这两个命令?
However, JS-beautify does work ... in case of all the files in a directory but not in sub-directory
但是,JS-beautify 确实有效......如果所有文件都在目录中但不在子目录中
You've mentioned that JS-beautify works if all the input files are in the same directory.您已经提到如果所有输入文件都在同一目录中,则 JS-beautify 可以工作。 Your command doesn't probably work because you pass all the results from
find
which might include input files from different directories.您的命令可能不起作用,因为您传递了
find
所有结果,这些结果可能包括来自不同目录的输入文件。
As mentioned in the comment earlier, you could use -exec
instead:正如前面评论中提到的,您可以使用
-exec
代替:
find . -type f -name "*.html" -exec js-beautify -r {} \;
Newer versions of GNU find
might use this syntax:较新版本的 GNU
find
可能使用以下语法:
find . -type f -name "*.html" -exec js-beautify -r {} +
I've run into a similar problem and found a simple cross-platform solution using glob-run :我遇到了类似的问题,并使用glob-run找到了一个简单的跨平台解决方案:
npm i -g glob-run js-beautify
glob-run html-beautify -r **/*.html
It would be nice if js-beautify supported globs itself , though.不过,如果 js-beautify本身支持 globs那就太好了。
find+xargs is the way to go. find+xargs 是要走的路。 It is faster than find with -exec.
它比使用 -exec 查找要快。
find . -name '*.html' | xargs js-beautify
If for some reason, you have spaces in your filenames, you'll want to do it like this...如果由于某种原因,你的文件名中有空格,你会想要这样做......
find . -name '*.html' -print0 | xargs -0 js-beautify
Finally, if for some strange reason, js-beautify won't work with multiple arguments, then you'll need to tell xargs to only pass in one argument at a time.最后,如果由于某种奇怪的原因,js-beautify 不能处理多个参数,那么您需要告诉 xargs 一次只传递一个参数。 This isn't much different than using the -exec option, but it's better IMO because it's just more consistent.
这与使用 -exec 选项没有太大区别,但 IMO 更好,因为它更一致。
find . -name '*.html' | xargs -n 1 js-beautify
Note, you can combine the -print0
and xargs -0
options with xargs -n 1
.请注意,您可以将
-print0
和xargs -0
选项与xargs -n 1
。
edit: As pointed out by TJ Crowder, the shell will not glob wildcards in double-quotes.编辑:正如 TJ Crowder 所指出的,shell 不会在双引号中使用通配符。 This was news to me, perhaps there is some ancient environment out there where that isn't true, and hopefully, you'll never be forced to work in it.
这对我来说是个新闻,也许有一些古老的环境并非如此,希望你永远不会被迫在其中工作。
1) Add these dependencies to your project 1)将这些依赖项添加到您的项目中
npm install --save-dev glob js-beautify
2) Create scripts/format.js
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) Add a format
script to package.json
3) 在
package.json
添加format
脚本
"scripts": {
"format": "node ./scripts/format.js"
}
4) In your project, run 4)在你的项目中,运行
npm run format
It seems like file globs are supported as of v1.8.9 (released December 2018).从v1.8.9 (2018 年 12 月发布)开始,似乎支持文件glob 。 For example :
例如:
js-beautify --html --replace '**/*.html'
Combining Bill's wisdom above and these answers on regexp matching , this is the actual solution for my project :结合上面比尔的智慧和这些关于正则表达式匹配的答案,这是我项目的实际解决方案:
find .找 。 -regextype egrep -regex './(src|test|app)/.*.(js|sass|html)' -print0 |
-regextype egrep -regex './(src|test|app)/.*.(js|sass|html)' -print0 | xargs -0 ./node_modules/.bin/js-beautify -r
xargs -0 ./node_modules/.bin/js-beautify -r
-r
)-r
)./node_modules/.bin
)./node_modules/.bin
) When used inside a package.json script, ./node_modules/.bin
is automatically in the path, \\.*
needs to be escaped to \\\\.*
, thus:在 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.