Pooja25
Pooja25

Reputation: 326

Capture the output of command line in a variable in Unix

I want to capture the output of the command below in a variable.

Command:

find . -iname 'FIL*'.TXT

The output is :

./FILE1.TXT

I want to capture './FILE1.TXT' into 'A' variable. But when I am trying

A=`find . -iname 'FIL*'.TXT`

then this command is displaying the data of the file. But I want ./FILE1.TXT value in the variable A.

Upvotes: 0

Views: 1467

Answers (3)

NeronLeVelu
NeronLeVelu

Reputation: 10039

Do you try ?

A="`find . -iname 'FIL*'.TXT`"

and

A="`find . -iname 'FIL*'.TXT -print`"

Upvotes: 1

A file does not have any value, but does have a content. Use the following to display that content.

  find . -iname 'FIL*'.TXT -exec cat {} \;

If you want all the contents (of all such files) in a variable, then

  A=$(find . -iname 'FIL*'.TXT -exec cat {} \;)

BTW you could have used

  find . -iname 'FIL*.TXT' -print0 | xargs -0 cat 

If you want the names of such files in a variable, try

  A=$(find . -iname 'FILE*.txt' -print)

BTW, on some several recent interactive shells (zsh, bash version 4 but not earlier versions) just write

  A=**/FILE*.txt

My feeling is that the ** feature is by itself worth switching to a newer shell, but it is just my opinion.

Also, don't forget that files may have several or no names. Read about inodes ...

Upvotes: 0

slayedbylucifer
slayedbylucifer

Reputation: 23522

# ls *.txt
test1.txt  test.txt
# find ./ -maxdepth 1 -iname "*.txt"
./test1.txt
./test.txt
# A=$(find ./ -maxdepth 1 -iname "*.txt")
# echo $A
./test1.txt ./test.txt

You can ignore -maxdepth 1 if you want to. I had to use it for this example.

Or with a single file:

# ls *.txt
test.txt
# find ./ -maxdepth 1 -iname "*.txt"
./test.txt
# A=$(find ./ -maxdepth 1 -iname "*.txt")
# echo $A
./test.txt

Upvotes: 1

Related Questions