Percorrer uma pasta e listar arquivos


14

Eu tenho uma pasta chamada 'amostra' e tem 3 arquivos nela. Quero escrever um script de shell que leia esses arquivos dentro da pasta de exemplo e publique-o em um site HTTP usando curl.

Escrevi o seguinte para listar 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

Está anexando a pasta pai nela. Quero a saída da seguinte forma (sem o nome da pasta pai)

log

clk

demo

Como eu faço isso?


1
use 'cd' primeiro. Se você precisar 'enrolar', ainda precisará inserir o diretório. Também você pode usar echo ${dir##*/}para sair do caminho.
eexpress utópico

Respostas:


32

Use basenamepara remover o caminho principal dos arquivos:

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

Embora porque não:

( cd sample; ls )

3

Supondo que seu shell o suporte, você pode usar a expansão de parâmetros

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

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


1
O --não é necessário aqui. O primeiro argumento é uma sequência fixa sem traços.
Kusalananda

Além disso, ${parameter##pattern}é suportado por todos os shells POSIX.
Kusalananda

2

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

Use "find" para criar uma lista de arquivos. Se você estiver usando o Bash, poderá inserir a saída de "localizar" em uma matriz. Exemplo abaixo, com a ressalva de que usei um comando "curl" não funcional!

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

Qual é o diretório aqui? $ '\ 0'? Eu quero passar um diretório que está em uma variável ...
Soylent Graham

searchDir é a variável de diretório. "-d $ '\ 0'" define o delimitador do comando de leitura como nulo.
Bb_referee 27/11/18

Como faço para conseguir a mesma coisa em um shell sh? Eu estou usando #! / Bin / sh
Ayusman

1

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

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

ls -1 sample

Melhor seria encontrar, porque você pode usar filtros:

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

Se você deseja executar comandos nos arquivos, use find e não um loop for:

find sample -type d -maxdepth 1 -exec basename {} \;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.