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.
-e or -ee... appears in the list, how many time \n appears in a file name. If there's a file called -n, it might not even return any line at all...
– Stéphane Chazelas
Feb 25 '13 at 15:05
touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l' (xpg_echo is enabled wherever bash is required to be Unix conformant). And in another empty directory: touch ./-n; bash -c 'echo * | wc -l'. A line is a sequence of characters terminated by a newline character. If echo doesn't output a newline character, it doesn't output any line. Behavior of text utilities like cut, awk or sed is unspecified if the input has extra characters after the last newline character and behavior varies across implementations.
– Stéphane Chazelas
Feb 25 '13 at 17:52
head not needed with awk 'NR==1{print $1} or awk '{print $1;exit}' and sed -n '1s/\s.*//p' (don't need $ because greedy)
– dave_thompson_085
Apr 04 '22 at 01:22
sed includes the whole line and awk includes \u00a0 in the end of an extracted word. If you have node installed, here is a clever command you can use to extract the first word: echo * | xargs node -e 'console.log(process.argv[1])' ([0] being node exec itself). Maybe it helps someone, who hacks some cli tools.
– Viktor M
Sep 28 '22 at 00:20
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.
head and cut
– Anwar
Jul 22 '17 at 18:24
echo * were a stream or some # of lines approaching infinity, wouldn't this be a particularly fun way to OOM your box? I don't if you can OOM of an assignment like this, as in does any shell provide constraints (like buffer + block writes to memory), but my guess is that there arent and that you definitely can write to all available memory on a casual, nothing to see here, assignment.
– christian elsee
Apr 03 '21 at 23:08
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]}"
bash was compiled or the environment, possibly on backslash characters, though.
– Stéphane Chazelas
Feb 24 '13 at 20:18
text=$(echo *); set -f; files=($text), otherwise more wildcards could be expanded.
– Stéphane Chazelas
Feb 24 '13 at 20:23
echo * | cut -d ' ' -f 1 is that good practice ?
– vdegenne
Feb 27 '13 at 19:40
You can use the positional parameters
set -- *
echo "$1"
* if there are no files in the directory.
– Chris Down
Feb 24 '13 at 12:47
-n , -e, -ne, -en, etc. On some platforms.
– Chris Davies
Apr 04 '22 at 08:20
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]}
$STRARRAY because bash automatically selects [0]
– dave_thompson_085
Apr 04 '22 at 01:19
lswon't work if one of the filenames contains a blank. – helpermethod Feb 25 '13 at 17:07Sunset on a beach.jpg, should it beSunsetor the whole file name? What aboutSea, sex and sun.ogg?Sea,Sea,or the whole file name? – Stéphane Chazelas Mar 21 '16 at 12:46ls | head -1gives me random things likea.patch p.pywhich is not the first word and not even files in alphabetical order. – phuclv Feb 13 '17 at 09:10