web-dev-qa-db-fra.com

Lecture des noms de fichiers dans un tableau

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?

51
dublintech

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.

84
Dennis Williamson

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
16
anubhava

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/

3
xizdaqrian

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
0
Josh Habdas

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.

0
KSU_Physics