0

This feels like an incredibly simple task, but I can't get it to work. I want to put the first 13 files in a directory into a .zip archive. The obvious way to do this is

    zip first13.zip $(ls | head -n 13)

But this fails because some of the filenames--which I can't change for stupid institutional reasons--have spaces in them. Replacing ls with ls --quoting-style=shell-always doesn't help (it actually makes things worse, because somehow zip ends up looking for files that start and end with literal ' characters, and yet still parses the spaces...) and neither does

    ls | head -n 13 | xargs zip first13.zip

Again, zip parses the spaces.

Weirdly, zip all.zip ./* works fine, so clearly some kind of escaping is possible, but I don't know how to replicate whatever zsh does in its globbing.

In case there is more than one version of zip out there, mine is the one that comes in Arch Linux's official zip package, and identifies itself as Copyright (c) 1990-2008 Info-ZIP. The shell is zsh version 5.8.

1 Answers1

5

Since you are using zsh, you should be able to use a glob qualifier of the form [m,n] to select a range of matches - avoiding the head pipeline (and its implicit whitespace splitting) altogether:

zip first13.zip ./*([1,13])

See man zshexpn for further details

steeldriver
  • 81,074