
Eu tenho uma pasta chamada 'sample' e contém 3 arquivos. Quero escrever um script de shell que leia esses arquivos dentro da pasta de amostra e publique-os 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 nele. Quero a saída da seguinte forma (sem o nome da pasta pai)
log
clk
demo
Como eu faço isso?
Responder1
Use basename
para retirar o caminho principal dos arquivos:
for file in sample/*; do
echo "$(basename "$file")"
done
Mas por que não:
( cd sample; ls )
Responder2
Supondo que seu shell 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á
Responder3
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 find, porque você pode usar filtros:
find sample -type d -maxdepth 1 -printf '%f\n'
Se você deseja executar comandos nos arquivos, você deve usar find e não um loop for:
find sample -type d -maxdepth 1 -exec basename {} \;
Responder4
Como os sistemas *nix permitem que quase qualquer caractere faça parte de um nome de arquivo (incluindo espaços em branco, novas linhas, vírgulas, símbolos de barra vertical, etc.), você nunca deve analisar a saída do comando "ls" em um script de shell. Não é confiável. VerPor 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 “find” em um array. Exemplo abaixo, com a ressalva de que usei um comando "curl" que não 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