staticint
staticint

Reputation: 62

How to write the result of a complex command to a file in Bash

I need to find files with *test* in their name, get their path and save them to a file. Here is the code:

find . -name *test* | xargs -I % bash -x "echo ''; readlink -f % '';"

It's working correctly, but I don't know how to write results to a file. printf "above code" >> result.txt is not working.

What do I need to change? Or is there any way to write this in a simpler way?

Upvotes: 1

Views: 277

Answers (2)

Benjamin W.
Benjamin W.

Reputation: 52132

The redirection is added to the end of the command, no need to try and wrap it in printf or similar:

find . -name *test* | xargs -I % bash -x "echo ''; readlink -f % '';" >> result.txt

This doesn't work, however, as the quoting in the bash -x command is off. I'm not sure what you're trying to achieve exactly, but I think it could be simplified to

find . -name '*test*' | xargs -I% readlink -f % >> result.txt

Notice that I've quoted '*test*' to make sure it's not expanded by the shell before find gets to see it.

Instead of find | xargs, you could use find -exec:

find . -name '*test*' -exec readlink -f {} + >> result.txt

This has the advantage of calling readlink as few times as possible.

And finally, if you don't actually care about resolving symlinks (and hidden files1), but just need canonical paths, you could do it without external tools:

shopt -s globstar    # Requires Bash 4.0 or newer
printf "$PWD/%s\n" **/*test* >> result.txt

1 If you do care about hidden files, you can use shopt -s dotglob to find them. If it is possible that there is no match at all, you can use shopt -s nullglob to avoid writing **/*test* literally to the result file.

Upvotes: 1

wicho160
wicho160

Reputation: 11

find . -name *test* | xargs -I % bash -x "echo ''; readlink -f % '';" > file.txt

Upvotes: 1

Related Questions