Come faccio a catturare l'output di ls o trovare il comando per memorizzare tutti i nomi di file in un array?
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.
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.