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?

you are viewing a single comment's thread
view the rest of the comments
[–] [S] 2 points 2 years ago* (last edited 2 years ago)

Some additional thoughts to be aware of by looking closer to each line (previously I just glanced over).

This point is not directly affecting your example, but I want to make you aware of something I fall into myself. Its one of those Bash quirks. Other shells might handle it differently, only speaking about Bash here. For a regular for loop over files, its important to note that if no file exists, the variable will be set to the search string. So example for x in *.png; do, if no .png file is found, then x will be set to *.png literally. So depending on what you do in the loop this could be catastrophic. But Bash has an option for this specifically: shopt -s nullglob . Using this option, if no file is found, then x will be set to an empty string. More about Bash options: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

for x in *.abcdefg; do echo "$x"; done
shopt -s nullglob
for x in *.abcdefg; do echo "$x"; done

BTW one can also do a read line by line without cat, by reading the file directly: (for some reasons Beehaw won't let me type the lower than character, so replace that, here a screenshot too):

while IFS= read -r line; do echo "Line: ${line}" ; done \< filenames.txt
  • source
  • parent