Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Let's say I have around 10 hg repositories cloned in a parent directory (let's call it "parent"). Is there any way I can invoke a mercurial command like hg status on all of the sub-directories rather than performing the laborious act of cding into each directory and then invoking hg status?

I did try out the good old xargs but for some reason it fails to work. The commands which I used are:

find . -maxdepth 1 -type d -print | xargs -t "hg status"


ls | xargs -t "hg status"

Update: the solution was to use explicit nameholders when using xargs. Something like:

ls | xargs -t -I {} hg status {}
share|improve this question
Remove the quotes. – Mikel Feb 20 '11 at 6:45
@Mikel: Still doesn't work, not that I didn't try it out... :) – sasuke Feb 20 '11 at 7:17
up vote 2 down vote accepted
for dir in ./*/
  (cd $dir && hg status)
share|improve this answer
Won't it be possible with a one-liner using the xargs combination? If not, I'd appreciate if you could explain why my one liner doesn't work. Thanks. – sasuke Feb 20 '11 at 14:51
The xargs version doesn't work because it ends up giving the directories as multiple arguments to a single hg command; this answer issues multiple hg commands in different directories (oh, and use semicolons instead of newlines and that is a one-liner!) – Norman Gray Feb 20 '11 at 20:40
@Norman: Thanks for the clarification. But the question again is, why does ls | xargs grep "something" works but ls | xargs hg status doesn't? – sasuke Feb 21 '11 at 5:41
@sasuke: grep accepts multiple files as arguments while hg status does not. – Patches Feb 21 '11 at 6:16
But then what about ls | xargs -t -I {} mv {} {}.old? Anyways, I've found the solution and it is to explicitly use placeholders in xargs. Thanks for guiding me on the right way, I'll accept your answer since it also does what I was after. :) – sasuke Feb 21 '11 at 17:28

If hg allows running in parallel, you can use GNU Parallel

parallel cd {} '&&' hg status ::: ./*/

If not you can add -j1:

parallel -j1 cd {} '&&' hg status ::: ./*/

Watch the intro video to learn more:

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .