Se o seu arquivo de mapeamento for separado por vírgulas, você pode fazer isso:
while IFS=, read orig target; do
mv "$orig" "$target"
done < mapping.txt
Eu tenho arquivos disponíveis em um diretório como:
filename15_1
filename15_2
filename15_3
filename15_4
E assim por diante.
Eu tenho outro arquivo que contém informações de mapeamento de como eu quero renomear os arquivos. Este é um arquivo CSV.
filename15_1,filename30_6
filename15_2,filename30_7
filename15_3,filename60_3
filename15_4,filename60_4
filename15_5,filename60_5
filename15_6,filename60_6
Eu quero renomear os quatro arquivos lendo o mapeamento acima. Os arquivos de mapeamento estão tendo mais informações do que os arquivos reais presentes no diretório.
Meus arquivos devem ser renomeados para o seguinte.
filename30_6
filename30_7
filename60_3
filename60_4
Como posso fazer isso?
Observação: sou uma pessoa com experiência em banco de dados e tenho pouco conhecimento em Unix.
Se o seu arquivo de mapeamento for separado por vírgulas, você pode fazer isso:
while IFS=, read orig target; do
mv "$orig" "$target"
done < mapping.txt
Bem, uma resposta bastante idiota, mas:
sed -e 's/^/mv /' -e 's/,/ /' $mapping_file | sh
uma abordagem concisa e legível seria a awk
' system
function
awk -F',' 'system("mv " $1 " " $2)' mappingFile.csv
que executará um comando para cada linha do arquivo de entrada
um resumo do comando
awk
unix util que é ótimo para processar dados tabulares -F','
o " F
ield separador" é uma vírgula system("mv " $1 " " $2)
é executado para cada linha do arquivo de entrada
system(x)
run x em uma subshell $1
e $2
referem-se à primeira e segunda colunas, respectivamente "mv " $1 " " $2
concatenação implícita cria o comando mappingFile.csv
usa este arquivo de entrada Com a ajuda das respostas acima, modifiquei o código da seguinte maneira e está funcionando.
cd $SRCE
for file in *
do
while IFS="," read srce target
do
if [[ $file = $srce ]] ; then
mv "$srce" "$target"
fi
done < map_lst
done