Quando você usa a expansão de cinta?

Eu entendo o que é expansão da chave , mas não sei a melhor forma use-o.

Quando você o usa?
Por favor, me ensine alguns exemplos convenientes e notáveis se você tiver sua própria dica.

Resposta

A expansão de chaves é muito útil se você tiver nomes de caminho longos. Eu a uso como uma maneira rápida de fazer backup de um arquivo :

cp /a/really/long/path/to/some/file.txt{,.bak} 

copiará /a/really/long/path/to/some/file.txt para /a/really/long/path/to/some/file.txt.bak

Você também pode usá-lo em uma sequência . Uma vez fiz isso para baixe muitas páginas da web:

wget http://domain.com/book/page{1..5}.html 

ou

for i in {1..100} do #do something 100 times done 

Comentários

  • Isso também pode ser usado para duplicação de argumentos. Digamos que você tenha algum programa que requer um ‘ -f ‘ argumento para cada arquivo para operar. em vez de program -f file1 -f file2 -f file3, você pode fazer program "-f file"{1..3}
  • Isso é uma pena. Acabei de descobrir, mas faço o backup em caminhos extralongos por anos sem saber disso. Obrigado.
  • @Patrick: Isso falha porque program recebe três palavras: "-f file1" "-f file2" "-f file3", em vez de 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Usar expansão para uso em um loop for é um pouco inútil, já que você pode escrever for ((i=1; i<=100; i++)) e é mais eficiente.

Resposta

Expansão da chave é muito útil ao criar grandes estruturas de diretório:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2} 

Isso fornecerá

find dir1 -type d dir1 dir1/subdir1 dir1/subdir1/subsubdir1 dir1/subdir1/subsubdir2 dir1/subdir2 dir1/subdir2/subsubdir1 dir1/subdir2/subsubdir2 

Você poderia até mesmo ir um passo além e colocar a expansão da chave na expansão da chave:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}} 

Isso lhe dará a mesma estrutura de diretório do exemplo acima.

Comentários

  • O aninhamento é bom, mas seu exemplo de aninhamento (mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) não ‘ t realmente servem a qualquer propósito. Você poderia ter feito isso: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
  • @iconoclast, tem um propósito se você interpretar subdir1 e subdir2 no sentido não literal. Substitua subdir1 por cat e subdir2 por dog por exemplo.
  • @ephsmith: se você interpretar ” subdir1 ” como substituto de ” cat ” e ” subdir2 ” para ” dog “, o exemplo de aninhamento falha, pois usa subdir {1,2} e não há string que você possa substituir ” subdir ” com isso fará com que subdir {1,2} return {cat, dog}.

Resposta

Eu uso quando quero reduzir a digitação:

geany /path/to/file1 /path/to/file2 # versus geany /path/to/file{1,2} 

Outro exemplo:

wajig install libpam0g-dev libiw-dev libdb-dev # versus wajig install lib{pam0g,iw,db}-dev 

Resposta

Eu uso para comparar o real saída de teste para saída de teste desejada durante o desenvolvimento. Se o teste nº 41 falhar, é fácil ver a diferença entre a saída do teste (no arquivo tests.output / 041) e a saída desejada (no arquivo tests.out / 041):

$ diff tests.{out,output}/041 

Resposta

Alguns casos frequentes para mim são:

Para renomear:

mv myText.{txt,tex} 

ou

mv myText.tex{,.old} 

ou

cp myText.tex{,.backup} 

(Embora seja menos complicado usar o controle de versão nas últimas 2 tarefas.)

Para comparar (já mencionado):

diff path{1,2}/a.txt 

Resposta

Existem várias respostas excelentes aqui, mas nenhuma delas menciona quando não para usar a expansão de chaves. Como os outros respondentes, uso bastante a expansão de chaves na linha de comando. Eu também o uso em meus apelidos e funções, pois posso esperar um shell inteligente.

Eu não o uso em meus scripts de shell (a menos que haja algum outro motivo para os scripts deve ser bash ou zsh, embora, nesses casos, seja melhor atualizar para uma linguagem de script “real” como perl ou python ) A expansão da chave é não portátil , pois não está em o padrão shell POSIX. Mesmo que funcione em seus /bin/sh shebang ed, não funcionará em sistemas com mais /bin/sh shells (por exemplo, dash).

No caso de uma diferença de um único dígito, você não precisa de expansão de chaves; uma classe de caractere será suficiente:

Bashismo:

diff file{1,2} 

Portátil:

diff file[12] 

Comentários

  • A diferença é que file{1,2} sempre se expandirá para file1 file2, enquanto file[12] se expande apenas para nomes de arquivos existentes: ou se file1 existe, mas file2 não ‘ t, file[12] se expande para file1 apenas. A [] expansão é realmente uma versão restrita de ? expansão (e são chamadas de ” expansões do nome do caminho “).
  • Correto, a expansão da chave não shell globbing (também conhecido como expansão de nome de caminho). Isso ‘ é um bom texto explicativo que não tem

    realmente já foi mencionado: a expansão da chave é melhor para notar caminhos ausentes inesperadamente. Você também pode globalizar a expansão entre chaves.

Resposta

Depois de dividir um arquivo muito grande com

split -b 100m hugeFile.zip part. 

vamos supor que esteja dividido em 262 partes, em outras palavras part.aa, part.ab, part.acpart.kb

Você pode juntar essas peças novamente aninhando expansões de chaves , como esta

cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *