Recorrer una carpeta y enumerar archivos

Recorrer una carpeta y enumerar archivos

Tengo una carpeta llamada "muestra" y contiene 3 archivos. Quiero escribir un script de shell que lea estos archivos dentro de la carpeta de muestra y los publique en un sitio HTTP usando curl.

He escrito lo siguiente para enumerar archivos dentro de la carpeta:

for dir in sample/*; do
        echo $dir;
        done

Pero me da el siguiente resultado:

sample/log

sample/clk

sample/demo

Está adjuntando la carpeta principal. Quiero el resultado de la siguiente manera (sin el nombre de la carpeta principal)

log

clk

demo

¿Cómo hago esto?

Respuesta1

Úselo basenamepara eliminar la ruta principal de los archivos:

for file in sample/*; do
    echo "$(basename "$file")"
done

Aunque por qué no:

( cd sample; ls )

Respuesta2

Suponiendo que su shell lo admita, podría usar la expansión de parámetros

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

o simplemente podrías cambiar a ese directorio y hacer el listado allí

Respuesta3

Depende de lo que quieras hacer con los directorios.

Para simplemente imprimir el nombre, sin verificar si es un directorio, puede usar ls:

ls -1 sample

Mejor sería encontrarlo, porque puedes usar filtros:

find sample -type d -maxdepth 1 -printf '%f\n'

Si desea ejecutar comandos en los archivos, debe usar buscar y no un bucle for:

find sample -type d -maxdepth 1 -exec basename {} \;

Respuesta4

Debido a que los sistemas *nix permiten que casi cualquier carácter forme parte de un nombre de archivo (incluidos espacios en blanco, nuevas líneas, comas, símbolos de canalización, etc.), nunca debe analizar la salida del comando "ls" en un script de shell. No es confiable. VerPor qué no deberías analizar la salida de ls.

Utilice "buscar" para crear una lista de archivos. Si está utilizando Bash, puede insertar la salida de "buscar" en una matriz. Ejemplo a continuación, con la advertencia de que utilicé un comando "curl" que no funciona.

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F ‘data=@"$file"’ UPLOAD_ADDRESS
    done
fi

información relacionada