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,
- Use NFS ou FUSE-over-SSH ou algo assim para expor o sistema de arquivos remoto localmente e, em seguida,
bash
aplique o glob padrãoFOO=/*/passwd
no 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.) - Faça SSH no sistema remoto e faça o glob lá.
ssh host 'echo /*/passwd'
- 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 $ID
da sua fonte, fácil de recolocar.