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?
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, thenx
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, thenx
will be set to an empty string. More about Bash options: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.htmlfor 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