como localizar um arquivo de nome não especificado no bash? [fechadas]

1

Eu tenho um bash como este para facilmente enviar um arquivo para o meu servidor:

FILE=../"$1"/1.txt
scp 1.txt remoteserver #upload the file to a remote server.

O $ 1 é para o diretório de entrada e eu tenho muitos diretórios. Mas o arquivo txt em todos esses diretórios não são todos denominados "1.txt". O que posso confirmar é que cada diretório contém apenas um arquivo txt.

Como localizo esse arquivo nessa situação?

Atualização:

Eu tentei digitar FILE=../"$1"/1.txt

mas quando eu verificar o arquivo com:

if [ -f "$FILE" ]

Noto que está ficando falso mesmo quando o arquivo existe.

Eu descobri que:

$FILE é ../test/1.txt

"$FILE" é ../test/*.txt

Então eu tenho que remover o par de " ?

    
por AGamePlayer 04.03.2015 / 01:45

1 resposta

2

Você pode usar o curinga * para o nome que não conhece. Digamos que você defina

FILE=../"$1"/*.txt

A expansão de curingas ocorre apenas fora das cotações. A variável $FILE ainda tem o asterisco. Então,

[ -f "$FILE" ]

é equivalente a

[ -f "../test/*.txt" ]

que quer um asterisco literal no nome do arquivo, mas

[ -f $FILE ]

é equivalente a

[ -f ../test/*.txt ]

que é expandido.

É um pouco perigoso usar $FILE para manter um padrão: se seu "$1" contiver um espaço, você não poderá fazê-lo funcionar entre aspas ou sem aspas: ele manterá o espaço, mas asterisco também, mas sem aspas vai se dividir no espaço. Você poderia jogar com IFS , mas, neste caso, uma variável intermediária não é a melhor ideia, de qualquer forma.

As pessoas vão se encolher com esse hack, mas se não tiver nomes de arquivos patológicos, funcionará. O que você pode fazer é forçar a expansão do nome de arquivo antes de salvá-lo na variável.

FILE="$(echo ../"$1"/*.txt)"

Agora, o asterisco é substituído pelo nome do arquivo real e, mais tarde, você pode usar com segurança a versão com aspas "$FILE" para proteger espaços, mas o asterisco desapareceu.

Isso falhará se não houver nenhum arquivo com esse nome, o asterisco será mantido como literal (a menos que você defina a opção nullglob bash). E se houver mais de um arquivo txt, isso também não funcionará corretamente. No entanto, isso sempre funcionará

for FILE in ../"$1"/*.txt; do whatever you want to do with '"$FILE"'; done
    
por 04.03.2015 / 09:51