Como renomear o arquivo no script bash um por um

1

Eu tenho muitos arquivos que se parecem com isso:

data1.csv
data2.csv
.
.
data(n).csv

Meu caso de uso é que quando eu chamar meu script, ele alterará data1.csv to data.csv e os arquivos restantes como estão e na próxima vez que eu chamar meu script na segunda vez, ele moverá data1.csv para a pasta processada e alterará data2.csv to data.csv e assim por diante.

    
por user188979 13.12.2014 / 11:00

2 respostas

1

O seguinte usa data.csv como um link para o arquivo solicitado para manter o status entre as iterações.

# check to see if an argument is given
if [ "$#" -ne 1 ]; then
        echo "Illegal number of parameters"
        exit
fi

# check if ran before if so move that to processed/ directory
if [ -h "data.csv" ]; then
        prev='readlink data.csv'
        echo "Found previous run $prev"
        rm -f data.csv  # remove link
        mv -f $prev processed/  # move previous file to processed directory
        echo "Moved to processed/$prev"
fi

# check to see if file exists
if [ -e data$1.csv ]; then
        ln -s data$1.csv data.csv  # link data.csv to the requested file
        echo "Linked data.csv -> data$1.csv"
else
        echo "No such file data$1.csv"
fi
    
por 13.12.2014 / 17:38
1

Se os nomes dos arquivos não tiverem novas linhas, você poderá encontrar o primeiro arquivo a ser processado em um script bash usando:

first=$(ls --sort=version *.csv | head -1)
ln -s "$first" data.csv 

no entanto, antes de renomear esse arquivo, certifique-se de que o antigo já esteja fora do caminho:

#! /bin/bash
if [ -e data.csv ] ; then
   mv $(readlink data.csv) backup_directory
   rm data.csv
fi

Combine os itens na ordem correta e adicione o processamento de data.csv no final e você pode repetidamente invocar o script para processar todos os arquivos.

    
por 13.12.2014 / 11:24