localizar arquivos cujo nome é menor ou maior que um determinado parâmetro

4

Digamos que em um determinado diretório eu tenha conseguido

tzury@x200:~/Desktop/sandbox$ ls -l
total 20
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P000
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P001
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P002
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P003
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P004
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P000
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P001
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P002

Eu procuro por uma maneira bash para pegar a lista de arquivos cujo nome é maior ou menor do que um determinado parâmetro, por exemplo:

$ my_finder lt N00.P003

deve retornar N00.P000 , N00.P001 e N00.P002

$ my_finder gt N00.P003

deve retornar N00.P004 , N01.P000 , N01.P001 e N01.P002

Eu estava pensando em iterar sobre for name in $(ls) e while $name != $2 , mas acredito que haja uma maneira mais elegante de fazer isso

    
por Tzury Bar Yochay 09.03.2011 / 10:00

3 respostas

3

Nunca nunca iterará sobre ls saída!

Esta é minha sugestão:

for fn in *; do test "$fn" -$1 "$2" && echo "$fn"; done

Editar:

Desculpe. Os trabalhos acima somente se $ fn e $ 2 forem numéricos. Você terá que substituir - $ 1 por $ op e preceder um seletor na frente do loop. op="<" ou op=">" dependendo de $ 1 é lt ou gt , respectivamente.

    
por 09.03.2011 / 10:59
1
for num in {001..003} ;do ls N00.P"$num"; done

Substitua 003 pelo limite que você deseja colocar.

    
por 09.03.2011 / 10:17
0

Infelizmente, para esta técnica, /usr/bin/test não suporta STRING > STRING , no entanto o shell embutido test faz então temos que invocar o shell para poder usar find -exec e evitar um loop:

find $PWD -type f -exec sh -c 'test "{}" "<" "$PWD/N00.P004"' \; -print

A questão permanece se a geração repetida de um shell é mais eficiente do que executar um loop. No entanto, a principal vantagem de usar essa técnica é que você pode fazer processamento recursivo sem um pipe.

Você pode criar uma função que usa essa técnica e permite usar gt e lt em vez de ter que passar entre < ou > :

my_finder () { 
    local op=$1
    case "$op" in
        "gt") op='>';;
        "lt") op='<';;
           *) echo "Invalid operator"; return 1;;
    esac
    find $PWD -type f -exec sh -c 'test "{}" "$op" "$PWD/$2"' \; -print
}

Uso:

$ my_finder gt N00.P003
/home/tzury/Desktop/sandbox/N00.P004
/home/tzury/Desktop/sandbox/N01.P000
/home/tzury/Desktop/sandbox/N01.P001
/home/tzury/Desktop/sandbox/N01.P002
    
por 09.03.2011 / 16:19

Tags