Xargs tips

After 12 years being a Windows admin, I've now used powershell more than other
languages so I'm pretty fluent in it's syntax. So it makes me happy when I
stumble upon bash/linux scripting paradigms which have been brought over to
powershell.

---

It's great to see the inspiration powershell has gained from
Unix systems and also great that it makes it easier for me to remember.

One paradigm I that I wished bash/\*nix had is the `Foreach-Object` command.
It makes working on collections of objects a breeze. I often find myself
scratching my head when trying similar tasks on \*nix. Enter `xargs`

Take this simple situation: I have a directory and I want to delete everything
bar a single .config file.

            $ ls -a
            .   blog.css  .entry-23032.md      .footer.html  main.css
            ..  .config   .entry-23032.md.swp  .header.html  .title.html

My powershell brain wants to:

            $ gci | ? Name -ne '.config' | foreach-object { rm $_ }

On \*nix, Xargs is a bit like adding pipeline input to rm

            $ ls -a | grep -v '\.config' | xargs rm

`xargs` is going to automatically append the output of the previous command as
an argument of the rm command. In this case the argument has to be the final
argument, but that can be changed using the `-I` parameter which specifies a
substitue variable

            $ ls -a | grep -v '\.config' | xargs -I '{}' echo "Delete {} ?"

Of course the powershell line could be a bit shorter

            $ gci | ? Name -ne '\.config' | rm

If you have any comments or feedback, please [email](mailto:jesse@zigford.org) me
and let me know if you will allow your feedback to be posted here.

Tags: bash-v-powershell, xargs, bash, powershell
