2012-06-11 14 views
41

Chcę uruchomić ls, aby uzyskać listę plików, a następnie odczytać wynik do tablicy, w której każdy element odpowiada nazwie pliku. czy to możliwe?Odczytywanie nazw plików do tablicy

+0

Tak, jest to możliwe. Może nie jest wskazane, jeśli nazwy mogą zawierać dowolne znaki (spacje i znaki nowej linii w nazwach powodują smutek), ale jest to wykonalne. Który z podręczników miałeś trudności ze zrozumieniem? –

Odpowiedz

65

Nie używaj ls, to nie przeznaczone do tego celu. Użyj globowania.

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

Opcja nullglob powoduje tablica jest pusta, jeśli nie są dopasowane.

+0

Dzięki, czy w ogóle mogę podać wyniki? Próbowałem czegoś takiego jak arr (* | grep ".txt"), ale to się nie podoba. – dublintech

+7

@dublintech: Nie potrzebujesz 'grep', po prostu dołącz ciąg znaków do swojego globu:' tablica = (*. Txt) 'lub' tablica = (* foo *) ' –

+0

Dzięki Denis. To się udało. – dublintech

11

Po utworzy tablicę arr z wyjściem ls w bieżącym katalogu:

arr=($(ls)) 

Znacznie lepiej i bezpieczniej niż ls można użyć echo *:

arr=(*) 

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

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

'ls' nie jest konieczne i nie powinno być używane do tego celu. –

+0

Zgadzam się, chciałem tylko powiedzieć, jak utworzyć tablicę z niektórych wyników polecenia. Jednak zredagowałem swoją odpowiedź na stres, że należy unikać wyjścia 'ls'. – anubhava

+2

Gdy rozszerzenie tablicy nie jest cytowane, wszystkie elementy tablicy są reprezentowane jako ciąg, a nie poszczególne elementy tablicy. Niecytowane '$ {arr [*]}' i '$ {arr [@]}' są takie same. – jordanm

4

W rzeczywistości ls nie jest drogą do zrobienia. Spróbuj tego:

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

Aby pobrać nazwy z tablicy:

echo ${FILELIST[x] 

-lub-

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

gdzie x & y są pierwszy element, aby uzyskać i jak wiele elementów po że.

Na dobry tutorial tablic bash, zobacz: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

+1

Powinieneś iterować po pliku glob * LUB * utwórz tablicę używając pliku glob jak w mojej odpowiedzi - nie * obu * !. Podczas dodawania elementów do tablicy nie ma powodu, aby używać długości tablicy w złożonym wyrażeniu indeksu (nie będzie działać zgodnie z oczekiwaniami, jeśli tablica jest rzadka, z jednej strony). 'tablica + = (element)'. Nie ma powodu, aby używać '$ (echo" $ f ")' po prostu wykonaj zadanie bezpośrednio.W jednym z poleceń 'echo' brakuje brakującego nawiasu klamrowego. –

0

Spróbuj tego,

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

Jestem zakładając będziesz wyciągać niechciane rzeczy z listy później.

Powiązane problemy