listar arquivos numerados em um intervalo específico


16

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.


Atualizei minha pergunta para incluir uma solução usando um forloop 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 bash
milkypostman

Respostas:


25

Tente o seguinte:

for file in file{18..31}.txt

É 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:

$ for i in {1..6..2}; do echo $i; done
1
3
5

Mas no Bash 3, você precisa fazer isso para obter os mesmos resultados:

$ for ((i=1; i<=6; i+=2)); do echo $i; done

O mesmo formulário incrementado em um:

$ for ((i=1; i<=6; i++)); do echo $i; done

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:

for ((i=18; i<=31; i++))
do
    echo "file${i}.txt"
done

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:

touch file{001..010}.txt

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:

for file in file{001..010}.txt; do echo "$file"; done

No Bash 3, se você precisar de zeros à esquerda, precisará preencher o valor sozinho:

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done

A printfinstruçã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:

$ touch "space name "{008..018..3}" more spaces"
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces
$ for f in "space name "{008..018..3}" more spaces"; do mv "$f" "${f}.txt"; done
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces.txt

Obrigado! Não sei onde foi essa minha vida inteira. A única coisa que não consigo trabalhar é que o incremento parece não funcionar na versão OSX do bash. ou seja, não consigo {1..10..2}trabalhar no meu OSX bash.
Milkypostman

Bem, é porque o Snow Leopard (por algum motivo) está usando o bash 3.1. Este é um problema de software.
Milkypostman

@milkypostman: O recurso de incremento e os zeros à esquerda {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}(ou i++para incrementar em um). Qualquer um dos números pode ser variável ou expressão. Em seguida, ao usar o valor no interior do forcircuito: 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 de icom zeros de modo a largura é de 3, por exemplo ( "4" torna-se "004").
Pausado até novo aviso.

Dennis, existe alguma maneira de atualizar sua solução para incluir o formulário alternativo. Sendo um comentário, está ofuscando o que eu provavelmente deveria receber.
Milkypostman

@milkypostman: Veja minha resposta editada.
Pausado até novo aviso.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.