Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

> Or for instance, say I have a directory of photos. I want to pick DSC00095.jpg through DSC00107.jpg. In bash, you cry; in zsh I say DSC<95-107>.jpg.

No need to cry -- Bash does it this way:

   DSC{95..107}.jpg.


Ugh... Did you actually try this?

  dima@fatty:/media/usb/DCIM/100RICOH$ ls R<22399-22402>*
  R0022399.JPG  R0022400.JPG  R0022401.JPG  R0022402.JPG
  dima@fatty:/media/usb/DCIM/100RICOH$ bash -c 'ls R {22392..22402}*'
  ls: cannot access R22399*: No such file or directory
  ls: cannot access R22400*: No such file or directory
  ls: cannot access R22401*: No such file or directory
  ls: cannot access R22402*: No such file or directory
Bash seems to treat these as strings, not like numbers. So in this specific case, I could have manually counted the number of 0s that are required. In some other case where the field width wasn't constant, I wouldn't be able to do that. What if I have files

file.1, file.2, file.3, ..., file.9, file.10, file.11, ...

How do I pick 9-11 in bash? The point is zsh has features that are a real productivity boost. It's certainly arguable whether a switch is worthwhile, but claiming that these features are just "cosmetic" is wrong.


  > How do I pick 9-11 in bash?
Like so:

  file.{9..11}
I think that you mean for the files to be numbered like:

  file.009
  file.010
  file.011
Bash would try to expand:

  file.{9..11}   => file.9   file.10.  file.11
  file.0{9..11}  => file.09  file.010  file.011
  file.00{9..11} => file.009 file.0010 file.0011
Neither would match all files.


    echo file.0{09..11}
    file.009 file.010 file.011


> Neither would match all files.

True, but this works: file.*{9..11}

It globs on the LHS, and requires the RHS to be literally consistent with the generated index.

I had the same problem with my earlier example, and the above is how I worked it out.


  file.{009..011}


> Ugh... Did you actually try this?

Your point is correct -- Bash is treating these as strings. I didn't have your file names so I tried a similar example, and I just realized I have to correct my example. I have a directory of graphic files with embedded numbers with leading zeros, for example 001 to 031. I was able to say:

$ ls geographic_harbor_2012_06_02_*{1..31}.JPG

And get all the members. But it's not the same as your example.


How old is your Bash? GNU bash, version 4.2.37(2)-release produces

  $ ls 
  R1004.jpg  R1006.jpg  R1008.jpg  R1010.jpg  R1012.jpg
  R1005.jpg  R1007.jpg  R1009.jpg  R1011.jpg  R1013.jpg
  $ ls R{1005..1009}*
  R1005.jpg  R1006.jpg  R1007.jpg  R1008.jpg  R1009.jpg


Read the post again. Your case works because you have exactly the right number of digits.


Missed that. Well, Bash does it intuitively however you like:

  $ echo {8..12}
  8 9 10 11 12
  $echo {08..12}
  08 09 10 11 12




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: