Quand je echo *
J'obtiens la sortie suivante:
file1 file2 file3 ...
Ce que je veux, c'est choisir le premier mot. Comment puis-je procéder?
Vous pouvez le diriger à travers awk et lui faire écho au premier mot
echo * | head -n1 | awk '{print $1;}'
ou vous coupez la chaîne et sélectionnez le premier mot:
echo * | head -n1 | cut -d " " -f1
ou vous le canalisez et le faites supprimer tout sauf le premier mot
echo * | head -n1 | sed -e 's/\s.*$//'
Ajout du | head -n1
pour satisfaire les piquants. Dans le cas où votre chaîne contient des sauts de ligne | head -n1
sélectionnera la première ligne avant que les commandes importantes sélectionnent le premier mot de la chaîne qui lui est passée.
En supposant un shell posixy (/bin/sh
ou /bin/bash
peut le faire)
all=$(echo *)
first=${all%% *}
La construction ${all%% *}
est un exemple de suppression de la sous-chaîne . Le %%
signifie supprimer la plus longue correspondance de *
(un espace suivi de n'importe quoi) à l'extrémité droite de la variable all
. Vous pouvez en savoir plus sur la manipulation de chaînes ici .
Cette solution suppose que le séparateur est un espace. Si vous faites cela avec des noms de fichiers, tous les espaces le briseront.
En supposant que vous voulez vraiment le premier nom de fichier et non le premier Word, voici un moyen qui ne casse pas sur les espaces:
shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"
Vous pouvez utiliser les paramètres positionnels
set -- *
echo "$1"
Cochez l'une des alternatives suivantes:
$ FILE=($(echo *))
$ FILE=$(echo * | grep -o "^\S*")
$ FILE=$(echo * | grep -o "[^ ]*")
$ FILE=$(find . -type f -print -quit)
Ensuite, vous pouvez l'imprimer via echo $FILE
.
Voir aussi: grep
le seul premier mot de la sortie?
Obtenir le premier nom de fichier entier:
shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )