wake-up-neo.com

Einlesen von Dateinamen in ein Array

Ich möchte eine Liste von Dateien erhalten und die Ergebnisse dann in ein Array einlesen, in dem jedes Array-Element einem Dateinamen entspricht. Ist das möglich?

51
dublintech

Verwenden Sie nicht ls, es ist nicht vorgesehen für diesen Zweck. Verwenden Sie Globbing.

shopt -s nullglob
array=(*)
array2=(file*)
array3=(dir/*)

Die Option nullglob bewirkt, dass das Array leer ist, wenn keine Übereinstimmungen vorhanden sind.

84

Folgendes erstellt ein Array arr mit der Ausgabe von ls im aktuellen Verzeichnis:

arr=( $(ls) )

Die Verwendung von ls ist jedoch überhaupt nicht sicher.

Viel besser und sicherer als ls können Sie echo * verwenden:

arr=( * )

echo ${#arr[@]} # will echo number of elements in array

echo "${arr[@]}" # will dump all elements of the array
16
anubhava

Tatsächlich ist ls nicht der richtige Weg. Versuche dies:

declare -a FILELIST
for f in *; do 
    #FILELIST[length_of_FILELIST + 1]=filename
    FILELIST[${#FILELIST[@]}+1]=$(echo "$f");
done

Um einen Dateinamen aus dem Array zu erhalten, verwenden Sie:

echo ${FILELIST[x]}

Um n Dateinamen ab x zu erhalten, verwenden Sie:

echo ${FILELIST[@]:x:n}

Ein großartiges Tutorial zu Bash Arrays finden Sie unter: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

3
xizdaqrian

In Bash können Sie ein Array von Dateinamen mit der Erweiterung pathname (globbing) erstellen:

#!/bin/bash
SOURCE_DIR=path/to/source
files=(
   "$SOURCE_DIR"/*.tar.gz
   "$SOURCE_DIR"/*.tgz
   "$SOURCE_DIR"/**/*
)

Das obige erstellt ein Array mit dem Namen files und fügt ihm N Arrayelemente hinzu, wobei jedes Element im Array einem Element in SOURCE_DIR entspricht, das auf .tar.gz oder .tgz endet, oder einem Element in einem Unterverzeichnis davon, dessen Rekursion als Dennis Punkte möglich ist out in den Kommentaren.

Sie können dann printf verwenden, um den Inhalt des Arrays einschließlich der Pfade anzuzeigen:

printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz

Oder verwenden Sie Parametersubstitution, um die Pfadnamen auszuschließen:

printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz
0
Josh Habdas

Versuche dies,

path="" # could set to any absolute path
declare -a array=( "${path}"/* )

Ich gehe davon aus, dass Sie das Unerwünschte später aus der Liste ziehen werden.

0
KSU_Physics