Como combinar um nome de arquivo especificando um prefixo substring?

1

Eu gostaria de copiar os arquivos, localizados em uma máquina remota, cujos nomes de arquivos correspondem a uma cadeia de prefixo, na minha máquina local.

Eu tentei selecionar apenas os arquivos cujos nomes começam com massif ou calgrind usando o seguinte comando:

scp my-machine:/home/user/a-folder/[massif,callgrind]* .

No entanto, essa expressão permite corresponder a string vazia mais qualquer número de caracteres e, portanto, corresponde a todos os nomes de arquivos relacionados ao diretório.

O que preciso alterar para que funcione corretamente?

    
por nico 25.10.2018 / 07:08

2 respostas

1

Parece que você quer colocar entre chaves aqui:

scp my-machine:/home/user/a-folder/{massif,callgrind}* .

Caso contrário, você está combinando em caracteres únicos, em vez das duas sequências completas.

bash faz vários tipos diferentes de expansão & substituição; estes são documentados na página man bash - procura pela seção EXPANSION . Aqui, o tipo [ é coberto por "Expansão de nome de caminho" (corresponde a nomes de caminhos) e { em "Expansão de chaves" (gera vários argumentos das opções fornecidas, independentemente dos arquivos presentes).

    
por 25.10.2018 / 07:10
0

Os arquivos podem ser selecionados usando dois métodos: os padrões podem ser especificados consecutivamente ou sucessivamente.

Primeiro método

Este método requer o uso de um padrão estendido Bash para especificar vários padrões juntos. O usuário deve ativar a opção extglob shell usando shopt builtin (cf shopt builtin ) porque os padrões estendidos do Bash não estão habilitados por padrão.

prompt% scp username@hostname:"/home/user/dirname/@(foo|bar)*" .

O sub-padrão Bash @(PATTERN-LIST) permite especificar uma lista de um ou mais padrões separados por | . Ele corresponde a um dos padrões fornecidos. Por exemplo, @(foo|bar) corresponde a foo ou bar , mas não corresponde a foobar , barfoo , foofoo , barbar .

A estrela glob corresponde a qualquer sequência de caracteres, incluindo a cadeia vazia. Portanto, o padrão @(foo|bar)* corresponde a todos os nomes de arquivos que começam com foo ou bar (prefixo (sub) string).

Este método funciona quando o shell remoto é Bash e sua opção extglob shell está ativada. O usuário pode ativar essa opção Bash em seu arquivo de configuração (por exemplo, ~/.bash_profile ), na máquina remota.

Segundo método

Este método executa o mesmo comando com argumentos diferentes, várias vezes. Funciona usando um shell compatível com POSIX.

for prefix in foo bar
do
    scp username@hostname:"/home/user/dirname/${prefix}*" .
done

Expansão de órtese

Este método não é robusto porque a expressão resultante pode especificar nomes de arquivos que não existem.

    
por 25.10.2018 / 12:01