Je veux obtenir une liste de fichiers, puis lire les résultats dans un tableau où chaque élément du tableau correspond à un nom de fichier. Est-ce possible?
N'utilisez pas ls
, c'est pas prévu à cette fin. Utilisez globbing.
shopt -s nullglob
array=(*)
array2=(file*)
array3=(dir/*)
L'option nullglob
fait en sorte que le tableau soit vide s'il n'y a pas de correspondance.
Ce qui suit va créer un tableau arr avec une sortie ls dans le répertoire courant:
arr=( $(ls) )
Bien qu'utiliser la sortie de ls
ne soit pas du tout sûr.
Bien mieux et plus sûr que ls
, vous pouvez utiliser echo *
:
arr=( * )
echo ${#arr[@]} # will echo number of elements in array
echo "${arr[@]}" # will dump all elements of the array
En fait, ls
n'est pas la solution. Essaye ça:
declare -a FILELIST
for f in *; do
#FILELIST[length_of_FILELIST + 1]=filename
FILELIST[${#FILELIST[@]}+1]=$(echo "$f");
done
Pour obtenir un nom de fichier du tableau, utilisez:
echo ${FILELIST[x]}
Pour obtenir n noms de fichiers du tableau à partir de x, utilisez:
echo ${FILELIST[@]:x:n}
Pour un excellent tutoriel sur les tableaux bash, voir: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/
Dans bash, vous pouvez créer un tableau de noms de fichiers avec l'extension pathname (globbing) comme suit:
#!/bin/bash
SOURCE_DIR=path/to/source
files=(
"$SOURCE_DIR"/*.tar.gz
"$SOURCE_DIR"/*.tgz
"$SOURCE_DIR"/**/*
)
Ce qui précède créera un tableau appelé files
et y ajoutera N éléments de tableau, où chaque élément du tableau correspond à un élément de SOURCE_DIR
se terminant par .tar.gz
ou .tgz
, ou à tout élément de son sous-répertoire avec une récursion de sous-répertoire possible comme Dennis out dans les commentaires.
Vous pouvez ensuite utiliser printf
pour voir le contenu du tableau, y compris les chemins:
printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz
Ou en utilisant substitution de paramètre pour exclure les noms de chemin:
printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz
Essaye ça,
path="" # could set to any absolute path
declare -a array=( "${path}"/* )
Je suppose que vous retirerez plus tard les éléments indésirables de la liste.