0

I have some files in a folder. By running the following command I can create a list with the filtered filenames ( test1, test2,test3) and pass it using xargs to a grep filtering command filter file in the command contains a few values to be filtered out.

ls -Art1 | grep test | xargs -L1 grep -vf filter > ouput

However when run this command output file contain the filtered result of test1, test2 and test3. All in one.

I would like to have separate file for each test1 > test1_output, test2 >test2_output,... so taking the xargs value and just add an extra string to it "_output" to generate an output filename

3
  • It's not recommendable parse ls. Check this Commented Oct 20, 2022 at 22:46
  • 2
    The link. was useful, however in my case not really relevant. I am well aware of the "space in the name" issue and I always avoid it. These scripts are for personal use only so no big risk of faulty output. Thanks for the comment.
    – peti27
    Commented Oct 21, 2022 at 4:29
  • You're welcome! And that's correct. While you don't have any problems with special filenames you can use lswithout any problem although it's useful to know about that. Commented Oct 21, 2022 at 20:36

1 Answer 1

1

There's no need to pipe the output of ls to search for a name match. Just use a shell glob. This also allows you to define an output file for each filter attempt

for file in *test*
do
    [ -f "./$file" ] && grep -vf filter "./$file" >"${file}_output"
done

Technically this is potentially a slightly different set of file matches to your ls -A as your code considers dot files whereas mine does not. Fixable if relevant.

In your comment you mention you are performing two actions on each file. If I have understood you correctly, then for such a situation you can modify the code like this:

for file in *test*
do
    if [ -f "./$file" ]
    then
        grep -f filter "./$file" >"${file}_delta"
        grep -vf filter "./$file" >"${file}_output"
    fi
done
3
  • It is working as expected! Thanks!
    – peti27
    Commented Oct 21, 2022 at 0:23
  • 1
    I played a bit more with the solution and actually love it even more. I added additional command to the script so now not only generates the output but also creates a delta between them. The "_delta" output is actually the same as executing the same line without the grep exclusion ("v") option.
    – peti27
    Commented Oct 21, 2022 at 4:23
  • @peti27 I've given you an option to address the _delta you mention Commented Oct 21, 2022 at 16:41

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .