4 ms·
Find is overkill for this. for file in *.java; do [[ -f $file ]] || continue javac "$file" done
by nescafe 15y ago
Find is overkill for this.
for file in *.java; do
[[ -f $file ]] || continue
javac "$file"
done
- waitwhat 15y agoyou need to doublequote $file on your second line: [[ -f "$file" ]] || continue
- babarock 15y agoThis would avoid errors on the files with whitespaces, however it will also avoid compiling them. You cannot make the assumption that a file with a whitespace should not be compiled.
- jcromartie 15y agoIt will compile files with whitespaces. That's what [[]] is for.
- babarock 15y agoNo it won't, [[ -f $file ]] will fail and `continue` will be executed, moving on to the next iteration of the loop. Think of the different successive values the $file variable will have. At no point, will it hold the full name of the file at once.
- jcromartie 15y agoI think you're confused. I just tried this in a few shells. It works in Bash on Cygwin and OS X. touch "file with spaces" for f in *; do if [[ -f $f ]]; then echo file: $f; fi; done; This echoes one line for "file with spaces".
- nescafe 15y agoIncorrect. Word splitting does not happen in [[ ]] tests. The only reason I had the [[ -f $file ]] || continue is to handle the case where there are no .java files, which will cause the for loop to iterate once with file set to '*.java'. i could have also used nullglob,but chose not to.
- SageRaven 15y agoWhat if "*.java" expands to something too large? Or is that only a relevant concern on the command line itself ("Argument list too long" error) and not within a script?
- pyre 15y agoI realize that this is specifically for bash, but this won't work in zsh: % for blah in *.java; do echo $blah; done zsh: no matches found: *.java
- cmurphycode 15y agoThat's just the zsh regex quirk; try quoting *.java.