Eu tenho um conjunto de arquivos em um diretório numerado da seguinte maneira:
file1.txt
file2.txt
...
file30.txt
...
Agora, eu gostaria de executar um comando em um intervalo específico de arquivos, digamos 18 a 31.
Até agora, usei as seguintes maneiras,
três argumentos
command file1[8-9].txt file2[0-9].txt file3[0-1].txt
Agora, suponha que eu queira qualquer outro número,
ciclo
for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command
parece que é um loop mais confiável (os espaços funcionam)
for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command
mas parece que deveria haver uma maneira mais simples de fazer isso. Eu estou supondo que a melhor solução é criar uma função bash que retornará o conjunto de arquivos para a linha de comando. Então eu poderia fazer algo como,
command `filerange file 18 31`
Existem melhores maneiras ou sugestões para fazer isso com eficiência?
Peço desculpas antecipadamente, se eu perdi a mesma pergunta respondida em algum outro lugar na Web ou em superuser
.
for
loop que permite espaços nos nomes de arquivos usando xargs. Parece funcionar se você não tiver o bash 4. Se você tiver o bash 4, use definitivamente a expansão de chaves! Veja a resposta selecionada. Plug Shameless para atualizar o Snow Leopard bashRespostas:
Tente o seguinte:
É conhecida como "expressão de sequência" e faz parte do recurso de expansão de chaves do Bash . Funciona no Bash 3 e 4.
O recurso de incremento é novo no Bash 4. Você provavelmente tem o Bash 3.x.
No Bash 4, você pode:
Mas no Bash 3, você precisa fazer isso para obter os mesmos resultados:
O mesmo formulário incrementado em um:
Qualquer um dos números pode ser variável ou expressão. No entanto, em uma expressão de sequência, os números devem ser constantes
Aqui está um exemplo usando esse formulário em seus arquivos:
Outro novo recurso das expressões de sequência no Bash 4 é a capacidade de incluir zeros à esquerda. Isso é útil se você deseja criar (e usar) arquivos numerados que podem ser classificados corretamente.
No Bash 4:
criaria arquivos denominados "file001.txt" a "file010.txt". Seus nomes serão classificados na ordem esperada. Sem os zeros à esquerda, "file10.txt" seria classificado antes de "file1.txt".
Para trabalhar com os arquivos, você pode usar a mesma sintaxe zero inicial:
No Bash 3, se você precisar de zeros à esquerda, precisará preencher o valor sozinho:
A
printf
instrução precederá o valor de i com zeros à esquerda para que a largura seja 3, por exemplo ("4" se torna "004").Editar:
A acomodação de espaços nos nomes de arquivos é simples:
fonte
{1..10..2}
trabalhar no meu OSX bash.{01..10}
são novos no Bash 4. Você provavelmente tem o Bash 3.x. Se você precisar do recurso de incremento ou usar variáveis para os limites do intervalo, use este formulário:for ((i=1; i<=10; i+=2}
(oui++
para incrementar em um). Qualquer um dos números pode ser variável ou expressão. Em seguida, ao usar o valor no interior dofor
circuito:echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do:
printf -vi '% 03D' $ i` que vai preceder o valor dei
com zeros de modo a largura é de 3, por exemplo ( "4" torna-se "004").