Como encontrar os próximos arquivos 'n' e o arquivo 'n + 1'-th para cada arquivo listado por' ls -1 '

0

Em um diretório, para cada arquivo listado por ls -1 . na ordem padrão que é a ordem lexicográfica, quero fazer o seguinte

  1. encontre os próximos n arquivos a partir e incluindo o arquivo, colocando-os em uma matriz chamada train e copie-os em um subdiretório tmp .

  2. encontre o arquivo n+1 -th, colocando-o em uma variável chamada test

  3. execute alguma operação em train , test e tmp . Remover arquivos em tmp .

train e test são reutilizados e devem ser sobrescritos para cada arquivo listado por ls .

tmp deve estar vazio antes de iniciar as etapas acima para cada arquivo listado por ls .

As três etapas são executadas em cada arquivo, exceto os últimos% arquivos n listados por ls , porque não há nenhum arquivo n+1 a partir de cada um deles.

Eu me pergunto como implementar o acima em bash? Obrigado.

Por exemplo ,

suponha que n seja 2 e os arquivos listados por ls no diretório atual sejam:

a
b
c
d
e
f

para a , encontrarei a e b e os colocarei no array train e copie-os para dir tmp , e encontre c e coloque na variável test . Em seguida, execute alguma operação em train , test e tmp . Finalmente, esvazie dir tmp .

para b , encontrarei b e c , e os colocarei no array train sobrescrevendo-o, copie-os para dir tmp e encontre d e coloque-o na variável test sobrescrevendo-o. Em seguida, execute alguma operação em train , test e tmp . Finalmente, esvazie dir tmp .

Em seguida, o desempenho acima é realizado em c e d , mas não em e e f , porque n = 2.

    
por Tim 07.01.2016 / 03:01

1 resposta

1

#!/bin/bash

declare -a all
all=('ls -1 | grep -v '^tmp$'')
n=2
i=0

while [ $((n+i)) -lt ${#all[*]} ]; do
    declare -a train
    j=0
    while [ $j -lt $n ]; do
            train[$j]=${all[$((i+j))]}
            cp ${all[$((i+j))]} tmp/
            j=$((j+1))
    done
    test=${all[$((i+j))]}
    i=$((i+1))
    # do something:
    echo "loop $i: contents of tmp/ are" $(ls tmp)", test=$test"
    rm -f tmp/*
done

Primeiro coloque todos os arquivos no array all .

Agora faça um loop enquanto houver espaço na matriz (deslocamento i mais número n é menor que o tamanho da lista de arquivos).

Use um loop para colocar n nomes de arquivos na matriz train a partir do deslocamento i e copie o arquivo no subdiretório tmp . Depois do loop, o próximo nome do arquivo é colocado em test .

Agora "faça alguma coisa".

Incremente o deslocamento i e execute o loop novamente.

Eu pessoalmente usaria o perl para isso.

    
por 07.01.2016 / 15:03

Tags