Renomeando arquivos com base no conteúdo de um arquivo de texto

2

Eu tenho muitos arquivos de pontos que preciso alterar para a entrada do modelo. Eu quero renomear muitos desses arquivos com base no conteúdo de um arquivo. Esses arquivos são arquivos de texto organizados em linhas.

nome do arquivo: data_lat_long.txt

1 data_20_20
2 data_30_40
3 data_50_60
.
.

e assim por diante

meus arquivos são nomeados 1 , 2 , 3 , 4 , etc.

Eu quero que 1 seja alterado para data_20_20 , 2 para data_30_40 e assim por diante.

    
por AiB 21.08.2013 / 23:43

1 resposta

4

while read line ; do 
    mv $line 
done < data_lat_long.txt

Redirecione o conteúdo de data_lat_long.txt para um loop while que usa read para ler em cada linha do arquivo e para cada linha atribuí-lo a uma variável chamada $line . Em seguida, execute mv com o conteúdo de $line como um argumento (que é de e para as partes que você especificou no arquivo data_lat_long.txt ). Continue em loop até o final do arquivo.

Observe que isso implicitamente espera que nenhum nome de arquivo no seu data_lat_long.txt contenha espaços (para que haja apenas duas colunas).

Se os arquivos tiverem espaços, sugiro um separador de vírgula no seu arquivo:

1,space file1
2,space file2
3,space file3

e, em seguida, use:

while IFS=',' read -a files 
do 
   mv "${files[0]}" "${files[1]}" 
done < list.txt

Isso faz uso da opção -a de read , que atribui o texto separado por IFS (neste caso, vírgula) a uma matriz chamada $files . Em seguida, indexamos os vários elementos no mv e citamos os argumentos com aspas duplas "" . Assim, o valor da matriz é expandido na execução do comando mv e , de forma que o espaço no arquivo não seja visto como separador de argumentos por mv . mv 1 space file1 não faz a mesma coisa que mv "1" "space file1" . O comando anterior tenta mover arquivos / diretórios chamados 1 e space para um diretório chamado file1 .

    
por 21.08.2013 / 23:59

Tags