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?


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 )

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í


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

¿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 {} \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.