Come faccio a catturare l'output di ls o trovare il comando per memorizzare tutti i nomi di file in un array?

StackOverflow https://stackoverflow.com/questions/4678418

Domanda

Necessità di elaborare i file in una directory corrente alla volta. Sto cercando un modo per prendere l'uscita di ls o find e memorizzare il valore risultante come elementi di una matrice. In questo modo posso manipolare gli elementi dell'array come necessario.

È stato utile?

Soluzione

Per rispondere alla tua domanda esatta, utilizzare il seguente:

arr=( $(find /path/to/toplevel/dir -type f) )

Esempio

$ find . -type f
./test1.txt
./test2.txt
./test3.txt
$ arr=( $(find . -type f) )
$ echo ${#arr[@]}
3
$ echo ${arr[@]}
./test1.txt ./test2.txt ./test3.txt
$ echo ${arr[0]}
./test1.txt

Tuttavia, se si desidera solo per elaborare i file uno alla volta, è possibile opzione find sia l'uso di -exec se lo script è alquanto semplice, o si può fare un loop su ciò che trovare ritorna in questo modo:

while IFS= read -r -d $'\0' file; do
  # stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)

Altri suggerimenti

for i in `ls`; do echo $i; done;

non può ottenere più semplice di così!

modifica: hmm - secondo il commento di Dennis Williamson, a quanto pare è possibile

modifica 2: anche se l'OP chiede specificamente come analizzare l'output di ls, volevo solo far notare che, come i commentatori di seguito hanno detto, la risposta corretta è "non lo fai". Utilizzare for i in * o simile, invece.

In realtà non c'è bisogno di usare ls / trovare i file nella directory corrente.

Basta usare un ciclo for:

for files in *; do 
    if [ -f "$files" ]; then
        # do something
    fi
done

E se si desidera i file nascosti di processo troppo, è possibile impostare l'opzione relativa:

shopt -s dotglob

Questo ultimo comando funziona solo in bash.

A seconda di cosa si vuole fare, si potrebbe usare xargs:

ls directory | xargs cp -v dir2

Ad esempio. xargs agiranno su ogni articolo restituito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top