Eu gostaria de copiar os arquivos, localizados em uma máquina remota, cujos nomes de arquivo correspondem a uma string 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, esta 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 devo alterar para que funcione corretamente?
Parece que você quer colchetes lá:
Caso contrário, você está correspondendo em caracteres únicos, em vez de duas strings completas.
bash
faz vários tipos diferentes de expansão e substituição; eles estão documentados na página de manual do bash - procura pelaEXPANSION
seção. Aqui, o[
tipo é coberto em "Pathname Expansion" (ele corresponde a nomes de caminho) e{
em "Brace Expansion" (gera vários argumentos a partir das opções fornecidas, independentemente dos arquivos presentes).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 habilitar a
extglob
opção shell usando oshopt
builtin (cfshopt
builtin ) porque os padrões estendidos do Bash não são habilitados por padrão.O subpadrã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)
correspondefoo
oubar
mas não corresponde afoobar
,barfoo
,foofoo
,barbar
.A estrela glob corresponde a qualquer sequência de caracteres, incluindo a sequência vazia. Portanto, o padrão
@(foo|bar)*
corresponde a todos os nomes de arquivo que começam comfoo
oubar
(prefixo (sub)string).Este método funciona quando o shell remoto é Bash e sua
extglob
opção de shell está habilitada. O usuário pode habilitar esta opção Bash em seu arquivo de configuração (ex.~/.bash_profile
), na máquina remota.Segundo método
Este método executa o mesmo comando com argumentos diferentes, várias vezes. Ele funciona usando um shell compatível com POSIX.
Expansão da cinta
Esse método não é robusto porque a expressão resultante pode especificar nomes de arquivo que não existem.