Recorrer una carpeta y enumerar archivos

14

Tengo una carpeta llamada 'muestra' y tiene 3 archivos. Quiero escribir un script de shell que leerá estos archivos dentro de la carpeta de muestra y lo publicará en un sitio HTTP usando curl.

He escrito lo siguiente para enumerar los 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

Se adjunta la carpeta principal en el mismo. Quiero el resultado de la siguiente manera (sin el nombre de la carpeta principal)

log

clk

demo

¿Cómo hago esto?

Raji
fuente
1
use 'cd' primero. Si necesita 'curl', aún necesita ingresar al directorio. También puedes usar echo ${dir##*/}para despegar el camino.
utopic eexpress

Respuestas:

32

Use basenamepara quitar la ruta principal de los archivos:

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

Aunque por qué no:

( cd sample; ls )
DopeGhoti
fuente
3

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ía cambiar a ese directorio y hacer la lista allí

Eric Renouf
fuente
1
El --no es necesario aquí. El primer argumento es una cadena fija sin guiones.
Kusalananda
Además, ${parameter##pattern}es compatible con todos los shells POSIX.
Kusalananda
2

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

Use "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 usé 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
bb_referee
fuente
¿Cuál es el directorio aquí? $ '\ 0'? Quiero pasar un directorio que está en una variable ...
Soylent Graham
searchDir es la variable de directorio. "-d $ '\ 0'" establece el delimitador del comando de lectura en nulo.
bb_referee
¿Cómo logro lo mismo en un sh shell? Estoy usando #! / Bin / sh
Ayusman
1

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 encontrar, porque puedes usar filtros:

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

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

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