Estoy tratando de ver si puedo asignar la salida del comando find a una variable. En este caso, sería una lista e iteraría un archivo a la vez para evaluar el archivo.

He intentado esto:

#!/bin/bash
PATH=/Users/mike/test

LIST='find $PATH -name *.txt'
for newfiles in @LIST; do
    #checksize
    echo $newfiles 
done

Mi salida es: @LIST

Estoy tratando de hacer lo mismo que el comando glob en perl en bash.

var = glob "PATH/*.txt";
0
Tags 7 sep. 2018 a las 22:12

3 respuestas

La mejor respuesta

Use $(command) para ejecutar command y sustituya su salida en lugar de esa construcción.

list=$(find "$PATH" -name '*.txt')

Y para acceder a una variable, coloque $ antes del nombre, no @ (se muestra su experiencia perl).

for newfiles in $list; do
    echo "$newfiles"
done

Sin embargo, es peligroso analizar la salida de find de esta manera, ya que obtendrá resultados incorrectos si alguno de los nombres de archivo contiene espacios en blanco; se tratarán como nombres múltiples. Es mejor canalizar la salida:

find "$PATH" -name '*.txt' | while read -r newfiles; do
    echo "$newfiles"
done

Además, tenga en cuenta que debe citar cualquier variable que no desee dividir en varias palabras si contienen espacios en blanco.

Y evite usar nombres de variables en mayúsculas. Esto está convencionalmente reservado para las variables de entorno.

3
Barmar 7 sep. 2018 a las 19:19

LIST = $ (buscar $ PATH -name * .txt) para archivos nuevos en $ LIST; hacer

Tenga en cuenta que tendrá problemas si alguno de los archivos tiene espacios en blanco en los nombres.

1
Cupcake Protocol 7 sep. 2018 a las 19:21

Suponiendo que esté utilizando bash 4 o posterior, no use find en absoluto aquí.

shopt -s globstar nullglob
list=( "$path"/**/*.txt )
for newfile in "${list[@]}"; do
    echo "$newfile"
done
0
chepner 7 sep. 2018 a las 19:29