2014-04-23 9 views
10

Mam wiele plików html w katalogu i podkatalogach. Mogę wykonać komendę js-beautify za pomocą wiersza poleceń i chcę zastosować ją rekursywnie do wszystkich tych plików.Jak wykonać rekursywnie JS-Beautify?

Próbowałem find . -name "*.html" -type f | js-beautify -r i js-beautify -r | find . -name "*.html" -type f, ale to nie działa. Jednak JS-Beautify działa jeśli dam coś podobnego js-beautify -r myfile.html lub js-beautify -r *.html (w przypadku wszystkich plików w katalogu ale nie w podkatalogu)

Może ktoś powiedzieć jak mam być potokiem te dwa polecenia?

+2

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

+2

@devnull^^^Wygląda dobrze dla mnie. Dlaczego nie uczynić z tego odpowiedzi? –

+0

@PervySage Jak to się nie udaje? Jakie błędy (jeśli występują) otrzymujesz? –

Odpowiedz

12

Jednak JS-Beautify działa ... w przypadku wszystkich plików w katalogu, ale nie w podkatalogu

Wspominałeś, że JS-upiększania dzieła, jeśli wszystkie wejścia pliki znajdują się w tym samym katalogu. Twoje polecenie prawdopodobnie nie działa, ponieważ przekazujesz wszystkie wyniki z find, które mogą zawierać pliki wejściowe z różnych katalogów.

Jak wspomniano w komentarzu wcześniej, można użyć -exec zamiast:

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

Jeśli ktoś robi to na komputerze Mac, a polecenie -r nie działa, udało mi się uzyskać to działając zamiast: 'find. -type f -name "* .js" -exec sh -c 'js-beautify {} >> {}' \; ' – Tiago

+0

Lub' find. -type f -name "* .js" -exec sh -c 'js-beautify {}> {} 2; mv {} 2 {}' \; 'jeśli to nie działa w pełni. Może ktoś ma lepszy/bardziej wydajny sposób robienia tego w linii. – Tiago

+0

Prawdopodobnie ta odpowiedź działała wstecz, ale obecnie wygląda na to, że js-beautify wykonuje niewłaściwe upiększanie w plikach html (prawdopodobnie js), jeśli jest używane w tym poleceniu – Andrey

4

find + xargs jest drogą do zrobienia. Jest szybszy niż znaleźć przy pomocy -exec.

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

Jeśli z jakiegoś powodu masz spacji w nazwach plików, będziemy chcieli, aby zrobić to w ten sposób ...

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

Wreszcie, jeśli z jakiegoś dziwnego powodu, JS-upiększać nie będzie działać z wieloma argumentami, wtedy musisz powiedzieć xargs, aby przekazywał tylko jeden argument na raz. Nie różni się to zbytnio od opcji -exec, ale jest to lepsze IMO, ponieważ jest po prostu bardziej spójne.

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

Uwaga, można połączyć opcje -print0 i xargs -0 z xargs -n 1.

edytuj: Jak wskazał T.J. Crowder, powłoka nie będzie zawierała symboli wieloznacznych w podwójnych cudzysłowach. To była dla mnie nowość, być może istnieje jakieś starożytne środowisko, w którym to nie jest prawdą i mam nadzieję, że nigdy nie będziesz zmuszony do pracy w nim.

+0

Powłoka spowoduje ich globalny wzrost, jeśli są w podwójnych cudzysłowach? Nigdy w to nie wpadłem. (Co znaczy: nigdy nie ominęły plików w podkatalogach zgodnych ze specyfikacją, ponieważ skoroszyt po prostu zawiera pliki w bieżącym katalogu po uruchomieniu komendy.) –

+0

Jeśli uwzględnisz inne odpowiedzi na posty, na które odpowiedziałeś, możesz rozważ także pozostawienie notatki dotyczącej tego, co można poprawić w odpowiedzi. – devnull

+0

@devnull Już stwierdziłem, że używanie opcji -exec nie jest dobrym wyborem. Oprócz problemu z szybkością, który wprawdzie nie ma znaczenia dla rozmiaru problemu każdego, trudniej jest wyjaśnić składnię opcji -exec. na przykład \; Wreszcie, wiedza na temat działania xargs jest bardzo przydatna w innych sytuacjach. na przykład gdy masz plik nazw plików, na które chcesz wykonać polecenie. Tak się czuję w tej sprawie. Mimo wszystko masz rację. Zamiast tego powinienem zostawić komentarz. SO nie pozwoli mi zmienić odpowiedzi. – Bill

10

jakie napotkasz podobny problem i znalazł proste rozwiązanie wieloplatformowe korzystając glob-run:

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

Byłoby miło, gdyby js-upiększyć supported globs itself.

+0

Awesome! Dziękuję Ci. – dude

2

1) Dodaj te zależności do projektu

npm install --save-dev glob js-beautify 

2) Utwórz 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) Dodaj format skrypt package.json

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

4) w projekcie , uruchom

npm run format 
+0

Działa świetnie! Cała zawartość Javascript z folderu projektu domowego i jego podkatalogów zostaje upiększona. – habamedia