Script shell para percorrer uma pasta e listar arquivos

9

Eu tenho uma pasta chamada 'sample' e ela tem 3 arquivos nela. Eu quero escrever um script de shell que irá ler esses arquivos dentro da pasta de exemplo e publicá-lo em um site http usando curl.

Eu escrevi o seguinte para listar os arquivos dentro da pasta:

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

Mas isso me dá a seguinte saída:

sample/log

sample/clk

sample/demo

Ele está anexando a pasta pai nela. Eu quero colocar como a seguir (sem nome da pasta pai)

log

clk

demo

Como faço isso?

Obrigado antecipadamente

    
por Raji 06.04.2017 / 17:16

4 respostas

16

Use basename para remover o caminho principal dos arquivos:

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

Por que não:

( cd sample; ls )
    
por 06.04.2017 / 17:25
3

Assumindo que seu shell suporta, você pode usar a expansão de parâmetro

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

ou você pode simplesmente mudar para esse diretório e fazer a listagem lá

    
por 06.04.2017 / 17:26
2

Como os sistemas * nix permitem que quase qualquer caractere seja parte de um nome de arquivo (incluindo espaços em branco, novas linhas, vírgulas, símbolos de pipe, etc.), você nunca deve analisar a saída do comando "ls" em um shell script. Não é confiável. Veja Por que você não deve analisar a saída de ls .

Use "localizar" para criar uma lista de arquivos. Se você estiver usando o Bash, você pode inserir a saída de "find" em um array. Exemplo abaixo, com a advertência de que usei um comando "curl" que não funciona!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'
searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'%pre%' 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
' 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
    
por 06.04.2017 / 18:19
1

Depende do que você deseja fazer com os diretórios.

Para simplesmente imprimir o nome, sem verificar se é um diretório que você poderia usar ls:

ls -1 sample

Melhor seria encontrar, porque você pode usar filtros:

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

Se você quer executar comandos nos arquivos, você deve usar find e não a for:

find sample -type d -maxdepth 1 -exec basename {} \;
    
por 06.04.2017 / 17:32