Use um curinga no caminho do diretório

Use um curinga no caminho do diretório

Estou tentando escrever um script bash em que parte de um diretório é uma string longa e desconhecida. Eu conheço a primeira parte do nome do diretório. Como combino a string conhecida e o curinga no caminho? A partir de agora, eu tenho:

ID=$1;

IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"

mas isso passa um literal *.

Responder1

Existem várias opções,

  1. Use NFS ou FUSE-over-SSH ou algo assim para expor o sistema de arquivos remoto localmente e, em seguida, bashaplique o glob padrão FOO=/*/passwdno caminho do sistema de arquivos exportado. (ZSH tem uma ${~spec}expansão de parâmetro de substituição glob, caso contrário, consulte o manual do seu shell.)
  2. Faça SSH no sistema remoto e faça o glob lá.ssh host 'echo /*/passwd'
  3. Passe o glob escapado (ou de outra forma desativado por meio de barra invertida ou aspas simples) para o sistema remoto,scp host:/\*/passwd .

Algumas dessas opções são propensas a condições de corrida caso o nome do arquivo mude entre o momento em que o glob é concluído e quaisquer etapas subsequentes envolvendo esse nome de arquivo (possivelmente alterado).

Responder2

Você pode usar tar sobre ssh,

tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"

Certifique-se de ter configurado o ssh-agent para que ele não solicite a senha. Eu não acho que você possa usar o diretório curinga com o scp, nem mesmo trabalhando com um cp normal.

Eu testei isso no bash e zsh.

Responder3

O lado direito de uma "Atribuição de Variável" é considerado entre aspas (sem divisão ou globing):

LESS=+'/A variable may be assigned' man bash

Uma variável pode ser atribuída por uma instrução no formato:
nome=[valor]
A divisão de palavras não é executada, ... . A expansão do nome do caminho não é executada.

Portanto:

$ var=*
$ echo "$var"
*

Para que um asterisco se expanda, você precisa usá-lo sem aspas:

var="$(echo *)"                ### Expand to the list of files on pwd.

No seu caso:

$ ID=one
$ IMP="$( echo "[email protected]:/data/$ID/EER_DATA/"*"/ImpostorScores.txt")"
$ echo "$IMP"
[email protected]:/data/one/EER_DATA/something/ImpostorScores.txt

Esse algo será expandido se todo o caminho corresponder, ou seja, uma árvore como esta realmente existir:

$ tree [email protected]\:/
[email protected]:/
└── data
    └── one
        └── EER_DATA
            └── something
                └── ImpostorScores.txt

Nota: removi o segundo $IDda sua fonte, fácil de recolocar.

informação relacionada