I created a simple alias for xargs, with the intend to pipe it when needed. It will simply run a command for each line of it. My question to you is, is this useful or are there better ways of doing this? This is just a little bit of brainstorming basically. Maybe I have a knot in my head.

# Pipe each line and execute a command. The "{}" will be replaced by the line.
# Example:
#   find . -maxdepth 2 -type f -name 'M*' | foreach grep "USB" {}
alias foreach='xargs -d "\n" -I{}'

For commands that already operate on every line from stdin, this won’t be much useful. But in other cases, it might be. A more simplified usage example (and a useless one) would be:

find . -maxdepth 1 | foreach echo "File" {}

It’s important to use the {} as a placeholder for the “current line” that is processed. What do you think about the usefulness? Have you any idea how to use it?

  • davelA
    link
    fedilink
    arrow-up
    3
    ·
    3 days ago

    A bit of a tangent, but I almost never use xargs in the shell anymore, and instead use “while read line ; do *SOMETHING* $line ; done”, because xargs doesn’t have access to the shell’s local variables, aliases, or functions.

    • dcdc@programming.dev
      link
      fedilink
      arrow-up
      1
      ·
      3 days ago

      True that the loop is easier to work with, though you can still pass args/env into the sub shell, and xargs’ -P is one of my favorites depending on the task (may not be desired in this case). Sometimes I’ve done both: echo assembled commands in a loop/find -exec, sanity check output, then pipe to xargs … bash -c to run in parallel.

    • thingsiplay@beehaw.orgOP
      link
      fedilink
      arrow-up
      1
      ·
      3 days ago

      Good point! A while loop is probably more flexible here and easier to expand too. I will experiment a bit more and maybe I’ll change to a while readline implemented as a Bash function.