this post was submitted on 24 Jan 2025
14 points (100.0% liked)

Linux

49393 readers
1654 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

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
[–] thingsiplay@beehaw.org 2 points 5 days ago (1 children)

Oh iter is a good one too. :D

[–] kittenroar@beehaw.org 2 points 1 day ago* (last edited 1 day ago) (1 children)

Here's the code:

#!/bin/bash
cmd=$@
if echo $cmd | grep '/$'
then
    xargs -rd '\n' -I {} $cmd{}
else
    xargs -rd '\n' -I {} $cmd {}
fi

Usage is like:

ls *zip | iter shasum

or

ls *zip | iter shasum ../zipfile_archive/

The second one would get the shasum of zip files that have the same name as ones in the cwd

This assumes, of course, that the input files have sane names, ie, no spaces, etc

[–] thingsiplay@beehaw.org 2 points 1 day ago* (last edited 1 day ago) (1 children)

Thanks for posting. I find the echo part and extra use of variable is a little bit flaky. Here is a modified version. But I am not 100% sure if its doing what your script is doing.

I skipped the extra variable and echo and grep, by comparing its content with ${*}, which is similar to ${@}, but won't separate each argument and create a single string instead. The =~ /$ is a regex comparison, which Bash supports native. Then I am using ${@} for the call, which separates each argument. Maybe this could be done with ${*} instead. I'm not sure which of them is the correct one for this case. At least it seems filenames with spaces work. Otherwise, not claiming it would be better. Just giving some food for thoughts.

#!/usr/bin/bash

if [[ "${*}" =~ /$ ]]; then
    xargs -rd '\n' -I {} "${@}"{}
else
    xargs -rd '\n' -I {} "${@}" {}
fi
[–] kittenroar@beehaw.org 2 points 1 day ago

Very nice; I will use this. Thanks!