listar arquivos numerados em um intervalo específico

14

Eu tenho um conjunto de arquivos em um diretório numerado da seguinte forma:

file1.txt
file2.txt
...
file30.txt
...

Agora, gostaria de executar um comando em um intervalo específico de arquivos, digamos 18 através de 31.

Até agora eu usei as seguintes formas,

três argumentos

command file1[8-9].txt file2[0-9].txt file3[0-1].txt

Agora, suponha que eu queira todos os outros números,

loop

for i in 'jot - 18 31 2'; do echo file${i}.txt; done | xargs command

isso parece ser um loop mais confiável (espaços de trabalho)

for i in 'jot - 18 31 2'; do echo "\"file${i}.txt\" "; done | xargs command

mas parece que deve haver uma maneira mais simples de fazer isso. Eu estou supondo que o 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 parecido,

command 'filerange file 18 31'

Existem melhores maneiras ou sugestões para fazer isso de maneira eficiente?

Peço desculpas antecipadamente se perdi essa mesma pergunta em outro lugar na Web ou em superuser .

    
por milkypostman 22.01.2011 / 16:53

1 resposta

22

Tente isto:

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

Ela é conhecida como "expressão de seqüência" e faz parte da expansão de chaves

O recurso de incremento é novo no Bash 4. Você provavelmente tem o Bash 3.x.

No Bash 4, você pode fazer:

$ 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

A mesma forma incrementando em um:

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

Qualquer um dos números pode ser variáveis ou expressões. No entanto, em uma expressão de seqüê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 de expressões de seqüência no Bash 4 é a capacidade de incluir zeros à esquerda. Isso é útil se você deseja criar (e usar) arquivos numerados que podem ser classificados adequadamente.

No Bash 4:

touch file{001..010}.txt

criaria arquivos com o nome "file001.txt" através de "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 iniciais, precisará preencher o valor por si mesmo:

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

A instrução printf prefixará o valor de i com zeros à esquerda, de forma que a largura seja 3, por exemplo ("4" se torna "004").

Editar:

A acomodação de espaços em nomes de arquivos é direta:

$ 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
    
por 22.01.2011 / 16:59

Tags