Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I JS-Beautify recursively?

I have lots of HTML files in a directory and sub-directories. I can execute js-beautify command through the command line and want to apply it recursively to all those files.

I have tried

find . -name ".html" -type f | js-beautify -randjs-beautify -r | find . -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)

Can anyone tell me how should I be piping these two commands?

like image 500
Pervy Sage Avatar asked Apr 23 '14 17:04

Pervy Sage


Video Answer


3 Answers

However, JS-beautify does work ... in case of all the files in a directory but not in sub-directory

You've mentioned that JS-beautify works if all the input files are in the same directory. Your command doesn't probably work because you pass all the results from find which might include input files from different directories.

As mentioned in the comment earlier, you could use -exec instead:

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

Newer versions of GNU find might use this syntax:

find . -type f -name "*.html" -exec js-beautify -r {} +
like image 140
devnull Avatar answered Oct 19 '22 18:10

devnull


I've run into a similar problem and found a simple cross-platform solution using 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.

like image 42
1j01 Avatar answered Oct 19 '22 18:10

1j01


find+xargs is the way to go. It is faster than find with -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. This isn't much different than using the -exec option, but it's better IMO because it's just more consistent.

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

Note, you can combine the -print0 and xargs -0 options with xargs -n 1.

edit: As pointed out by T.J. Crowder, the shell will not glob wildcards in double-quotes. 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.

like image 25
Bill Avatar answered Oct 19 '22 18:10

Bill