Jest to dość proste, mam folder z kilkoma podfolderami plików JS i chcę uruchomić kompilator Clojure Google na wszystkich plikach w tych folderach. Polecenie przetworzenia pojedynczego pliku jest następujące:
java -jar compiler.jar --js filename.js --js_output_file newfilename.js
Jak zmodyfikować to, aby działało na każdym pliku JS w mojej strukturze katalogów?
mv
plik do oryginalnej nazwy.find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; done
, załatw sprawę.find -exec
doskonale nadaje się do prostych poleceń. dla złożonychfind | xargs
jest znacznie lepszy, a także pozwala na równoległe uruchamianie poleceń.xargs
jest lepszy?Możesz także użyć prostej
for
pętli, szczególnie jeśli pliki znajdują się w jednym katalogu (bez podkatalogów). Można go zmodyfikować, aby działał również z podkatalogami.Bez rekurencji:
lub jako równoważny jednowarstwowy:
Aby przejść do podkatalogów (wymaga GNU bash 4.0 lub nowszej wersji) (dzięki @ChrisDown ):
źródło
globstar
to zrobić.**
może pasować do dowolnego poziomu rekurencji,**/*.js
działa: sprunge.us/PXQKfor f in ./*.js; do
lubfor f in ./**/*.js; do
w celu ochrony przed nazwami plików zaczynającymi się od-
(nie wiem, czy jest to konieczne w tym przypadku, ale i tak jest to dobry nawyk).