Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: alternative method for a simple for
- X-seq: zsh-users 14380
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: <zsh-users@xxxxxxxxxx>
- Subject: Re: alternative method for a simple for
- Date: Tue, 15 Sep 2009 02:00:07 -0700
- In-reply-to: <20090915125419.3528@binki>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- References: <20090915125419.3528@binki>
On Sep 15, 12:54pm, d.henman wrote:
}
} (Method 1.) Note that I could not not use this method as shown below
}   $ zmv -p ffmpeg -o " -b 160k -i" '(*).wav' '$1.mp3'
} 
} because it puts two hypens, "--", between -i and filename, as below:
}      ffmpeg -b 160k -i -- song1.wav song1.mp3
}      ffmpeg -b 160k -i -- song2.wav song2.mp3
Yes, as the zmv doc says:
    -p PROGRAM
          Call PROGRAM instead of cp, ln or mv.  Whatever it does, it
          should at least understand the form
               PROGRAM -- OLDNAME NEWNAME
          where OLDNAME and NEWNAME are filenames generated by zmv.
So you need to satisfy those constraints.
    function wav2mp3 {
      [[ "$1" == "--" ]] && shift
      ffmpeg -b 160k -i ffmpeg -b 160k -i "$@"
    }
    zmv -p wav2mp3 '(*).wav' '$1.mp3'
} --------
} 
} (Method 2.) Likewise I could not use zargs, yet at least,
}      because replacements or expansions //l/r or :r didn't seem to work..
} 
} $ zargs --replace=arg -e.. -- *.wav .. ffmpeg -b 160k -i arg ${${file::=arg}//.wav/.mp3}
Close, but you need to delay the expansion of your ${...} expression
until zargs executes the command.  The way you wrote it, the parameter
substitution occurs before zargs is even run.  Quotes are needed:
    zargs --replace=arg -e.. -- *.wav .. eval \
      ffmpeg -b 160k -i '"arg"' '${${file::="arg"}//.wav/.mp3}'
However, it's pretty hard to get the quoting perfect with that eval
in there.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author