
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 basename
para 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