Use um curinga no caminho do diretório

5

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

ID=$1;

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

mas isso passa literalmente em * .

    
por Adam_G 20.05.2016 / 00:37

3 respostas

1

Existem várias opções,

  1. Use NFS ou FUSE-over-SSH ou algo para expor o sistema de arquivos remoto localmente e, em seguida, deixe bash aplicar o FOO=/*/passwd glob padrão nesse caminho do sistema de arquivos exportado. (ZSH tem uma expansão de parâmetro de substituição ${~spec} glob, caso contrário, consulte o manual do seu shell.)
  2. SSH para o sistema remoto e faça o glob lá. %código%
  3. Passe o escape (ou de outra forma defangido via barra invertida ou aspas simples) para o sistema remoto, ssh host 'echo /*/passwd'

Algumas destas opções são propensas a condições de corrida, caso o nome do arquivo seja alterado entre quando o glob é feito e quaisquer etapas subseqüentes envolvendo esse (possivelmente alterado) nome de arquivo.

    
por 20.05.2016 / 01:59
0

Você pode usar tar sobre ssh,

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

Verifique se você configurou o ssh-agent para que ele não lhe indique a senha. Eu não acho que você pode usar o curinga dir com scp, nem mesmo trabalhando com um cp regular.

Eu testei isso no bash e zsh.

    
por 20.05.2016 / 03:39
0

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

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

A variable may be assigned to by a statement of the form:
name=[value]
Word splitting is not performed, ... . Pathname expansion is not performed.

Portanto:

$ var=*
$ echo "$var"
*

Para que um asterisco se expanda, você precisa usá-lo sem cotação:

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 existe:

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

Observação: removi o segundo $ID da sua fonte, fácil de substituir.

    
por 21.05.2016 / 06:29