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
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
esubdir2
no sentido não literal. Substituasubdir1
porcat
esubdir2
pordog
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á parafile1 file2
, enquantofile[12]
se expande apenas para nomes de arquivos existentes: ou sefile1
existe, masfile2
não ‘ t,file[12]
se expande parafile1
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.ac
… part.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
program -f file1 -f file2 -f file3
, você pode fazerprogram "-f file"{1..3}
program
recebe três palavras:"-f file1" "-f file2" "-f file3"
, em vez de 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
é um pouco inútil, já que você pode escreverfor ((i=1; i<=100; i++))
e é mais eficiente.