
Estoy intentando imprimir los nombres de todos los archivos .txt de la carpeta actual en una línea. Estoy usando el siguiente script. Sin embargo, no imprime nombres de archivos.
REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ+="${name} "
done
echo "Full Sequence: ${REF_SEQ}"
Tengo 3-4 archivos .txt en mi carpeta actual (A.txt, B.txt...). Estoy esperando resultados como
Secuencia completa: A.txt B.txt...
Si solo uso find
el comando sin asignar salida a la variable RED_SEQ
, obtengo el resultado deseado. Esto sugiere que el comando de búsqueda funciona bien pero de alguna manera no puedo asignarlo a una variable. Probé varios operadores de asignación diferentes pero todavía no tuve suerte.
Respuesta1
Para actualizar una variable en bash
, debe utilizar esta sintaxis:
VAR="some stuff$VAR"
Pero, dado que está utilizando una tubería, el while
bucle se ejecuta en un sub-shell, su variable se pierde.
Para corregir esto, debes tener la sintaxis:
while read f
do
done <<< $(input)
Entonces en tu caso:
REF_SEQ=""
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)
echo "Full Sequence: ${REF_SEQ}"
Respuesta2
El problema es que usas {} detrás del símbolo de tubería. Esto solo es válido en la opción -exec de buscar, pero no detrás del símbolo de tubería.
Podrías probar lo siguiente:
REF_SEQ=$(find . -max Depth 1 -name "*.txt" -type f -printf "%f " | xargs)
Esto debería producir el resultado que desea. La directiva printf %f genera el nombre base del archivo encontrado y xargs "transpone" el resultado.
Saludos cordiales Jürgen