shell 如何递归地JS美化?

4si2a6ki  于 2023-10-23  发布在  Shell
关注(0)|答案(7)|浏览(124)

我有很多HTML文件在一个目录和子目录。我可以通过命令行执行js-beautify命令,并希望将其递归地应用于所有这些文件。
我已经尝试
find . -name“.html”-type f| js-beauty-r and js-beauty-r| find . -name“.html”-type f
但它不起作用然而,如果我给予类似js-beautify -r myfile.htmljs-beautify -r *.html的东西,JS-beauty确实可以工作(如果所有文件都在一个目录中,而不是在子目录中)
有谁能告诉我应该如何管道这两个命令?

t1qtbnec

t1qtbnec1#

然而,JS美化确实工作...如果所有文件都在一个目录中,但不在子目录中
您已经提到,如果所有输入文件都在同一个目录中,JS-beauty就可以工作。您的命令可能不起作用,因为您传递了来自find的所有结果,其中可能包括来自不同目录的输入文件。
如前所述,你可以使用-exec

find . -type f -name "*.html" -exec js-beautify -r {} \;

较新版本的GNU find可能使用以下语法:

find . -type f -name "*.html" -exec js-beautify -r {} +
gab6jxml

gab6jxml2#

我遇到过类似的问题,并找到了一个简单的跨平台解决方案,使用glob-run

npm i -g glob-run js-beautify
glob-run html-beautify -r **/*.html

如果js-beautiful supported globs itself就好了。

nmpmafwu

nmpmafwu3#

find+xargs是正确的方法。它比用-exec查找要快。

find . -name '*.html' | xargs js-beautify

如果出于某种原因,你的文件名中有空格,你会想这样做。

find . -name '*.html' -print0 | xargs -0 js-beautify

最后,如果出于某种奇怪的原因,js-beauty不能处理多个参数,那么你需要告诉xargs一次只传入一个参数。这与使用-exec选项没有太大区别,但在IMO中更好,因为它更一致。

find . -name '*.html' | xargs -n 1 js-beautify

注意,您可以将-print0xargs -0选项与xargs -n 1组合使用合并。
编辑:正如T. J所指出的。Crowder,shell不会在双引号中显示通配符。这对我来说是新闻,也许有一些古老的环境在那里,这是不正确的,希望,你永远不会被迫在它的工作。

dfddblmv

dfddblmv4#

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)将format脚本添加到package.json

"scripts": {
  "format": "node ./scripts/format.js"
}

4)在项目中,运行

npm run format
nwlls2ji

nwlls2ji5#

它看起来像file globs are supported,因为v1.8.9(2018年12月发布)。举例来说:

js-beautify --html --replace '**/*.html'
r7s23pms

r7s23pms6#

结合Bill的上述智慧和these answers on regexp matching这是我的项目的实际解决方案
find . -regextype egrep -regex './(src|测试|app)/.*.(js| sass| html)' -print0| xargs-0./node_modules/.bin/js-beauty-r

  • 只在正确的文件夹中查找(即,不是node_modules)
  • js,sass,html
  • 可以处理带有空格的文件名
  • 就地重写(-r
  • 不依赖于节点shebang
  • 使用本地安装的js-beauty(./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
...
bksxznpy

bksxznpy7#

扩展@devnull的答案,对于macos用户(只是为了更容易复制粘贴),这里是你需要添加到.bash_profile的内容:

alias js-beautify-alljs='find . -type f -name "*.js" -exec js-beautify -r {} \;'
alias js-beautify-alljsx='find . -type f -name "*.jsx" -exec js-beautify -r {} \;'
alias js-beautify-allts='find . -type f -name "*.ts" -exec js-beautify -r {} \;'
alias js-beautify-alltsx='find . -type f -name "*.tsx" -exec js-beautify -r {} \;'
alias js-beautify-allhtml='find . -type f -name "*.html" -exec js-beautify -r {} \;'
alias js-beautify-allcss='find . -type f -name "*.css" -exec js-beautify -r {} \;'
alias js-beautify-allscss='find . -type f -name "*.scss" -exec js-beautify -r {} \;'
alias js-beautify-alljson='find . -type f -name "*.json" -exec js-beautify -r {} \;'
alias js-beautify-all='js-beautify-alljs && js-beautify-alljsx && js-beautify-allts && js-beautify-alltsx && js-beautify-allhtml && js-beautify-allcss && js-beautify-allscss && js-beautify-alljson;'

然后只需运行source ~/.bash_profile,然后按照要求
js-beautify-alljsjs-beautify-alljsxjs-beautify-alltsjs-beautify-alltsxjs-beautify-allhtmljs-beautify-allcssjs-beautify-allscssjs-beautify-alljson
或所有8种格式:
js-beautify-all

相关问题