Como você analisa um subdiretório onde o caminho contém espaços? [duplicado]

1

Estou tentando analisar um conjunto de arquivos em um diretório em uma unidade mapeada. No entanto, parece que não consigo resolver um problema que parece ser devido a espaços no caminho para o subdiretório. Gostaria de receber ajuda! Obrigado.

#!/bin/bash
FILES=/home/user/.gvfs/analysis\$\ on\ server.university.edu/users/username/m/BED_files/*
#FILES=/home/user/Desktop #this works

for f in "${FILES}"
do
    echo $f
done
    
por Stephen 24.02.2015 / 17:14

3 respostas

2

Você não pode usar o caractere curinga como parte da variável se também estiver usando aspas. Note que na sintaxe da variável array @jasonwryan sugeriu, ele está olhando o conteúdo do diretório no momento em que o array é inicializado, ao invés de quando o loop é executado.

#!/bin/sh
DIR='/home/user/.gvfs/analysis$ on server.university.edu/users/username/m/BED_files'

for f in "$DIR"/*
do
    echo "$f"
done

Se você realmente precisar que o caractere curinga seja definido em uma variável, o trabalho em um outro separado funcionará:

#!/bin/sh
DIR='/home/user/.gvfs/analysis$ on server.university.edu/users/username/m/BED_files'
FILES='*.txt'

for f in "$DIR"/$FILES
do
    echo "$f"
done
    
por 24.02.2015 / 18:55
0

Verifique se você tem permissões até o subdiretório final e se a resposta @jasonwryan deve funcionar.

    
por 24.02.2015 / 18:50
0

Se você deseja trabalhar com um resultado de expansão com array em um shell POSIX básico, você deve tomar cuidado com $IFS e geração de nome de arquivo. Você pode trabalhar com segurança com variáveis sem aspas - mas geralmente não é a maneira mais simples de fazê-lo.

Os Shell's são projetados para funcionar em primeiro lugar com argumentos - por isso sugiro que você use a matriz de argumentos:

set -- "${FILES%/*}"/*

Você terá que verificar o resultado de um glob - em qualquer shell POSIX, se o glob não resolver, ele continuará sendo um parâmetro iterável. Isso também é verdade para for var in glob* - sem testar os resultados, você não pode ter certeza de que está realmente trabalhando com um arquivo. Então ...

for f do [ -e "$f" ] || [ -L "$f" ] && printf %s\n "$f"; done

Você pode iterar os itens em sua matriz arg como for arg do ...;done . Você também pode endereçá-los de dentro do loop como "$1" "$2 "e etc, ou como um todo com "$@" e "$*" dependendo. A matriz permanece definida quando o loop é concluído.

Uma última nota, como mencionei antes, a geração de nome de arquivo é um recurso configurável do shell. Pode ser desabilitado com set -f ou habilitado com set +f . Além do mais, isso só funciona se houver nomes de arquivos correspondentes no diretório em que você pesquisa - se não houver nenhum, você simplesmente recupera seu glob não resolvido. Globbing também requer permissões de busca e execução para um diretório. Então, se você achar que não pode resolver uma correspondência glob, você pode tentar ativar a geração de nome de arquivo, verificar as permissões do caminho e verificar se há arquivos lá em primeiro lugar.

    
por 24.02.2015 / 19:47