When I echo * I get the following output:
file1 file2 file3 ...
What I want is to pick out the first word. How can I proceed?
When I echo * I get the following output:
file1 file2 file3 ...
What I want is to pick out the first word. How can I proceed?
You can pipe it through awk and make it echo the first word
echo * | head -n1 | awk '{print $1;}'
or you cut the string up and select the first word:
echo * | head -n1 | cut -d " " -f1
or you pipe it thorugh sed and have it remove everything but the first word
echo * | head -n1 | sed -e 's/\s.*$//'
Added the | head -n1 to satisfy nitpickers. In case your string contains newlines | head -n1 will select the first line first before the important commands select the first word from the string passed to it.
Assuming a posixy shell (/bin/sh or /bin/bash can do this)
all=$(echo *)
first=${all%% *}
The construct ${all%% *} is an example of substring removal. The %% means delete the longest match of * (a space followed by anything) from the right-hand end of the variable all. You can read more about string manipulation here.
This solution assumes that the separator is a space. If you're doing this with file names then any with spaces will break it.
Assuming that you really want the first filename and not the first word, here's a way that doesn't break on whitespace:
shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"
You can use the positional parameters
set -- *
echo "$1"
Check one of the following alternatives:
$ FILE=($(echo *))
$ FILE=$(echo * | grep -o "^\S*")
$ FILE=$(echo * | grep -o "[^ ]*")
$ FILE=$(find . -type f -print -quit)
Then you can print it via echo $FILE.
See also: grep the only first word from output?
Getting the whole first file name:
shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
Another approach is to list all the file names as an array, and then index the array for the first element:
STRARRAY=($(echo *))
FIRST=${STRARRAY[0]}