Para valores separados em branco
(como na versão inicial da sua pergunta)
(cd /parent/folder && tail -n +2 | xargs -L 1 mv --) < file
O tail é pular o cabeçalho.
Com -L 1 , xargs executa um comando mv para cada linha de sua entrada com as palavras nessa linha passadas como argumentos para mv .
Para xargs , palavras são delimitados em branco (se são todos espaços em branco ou apenas espaço e a guia depende da implementação xargs ), embora xargs também reconheça " , ' e \ como operadores de cotação que podem ser usados para escapar desses espaços em branco ou uns aos outros.
Você também pode usar um loop% shell while read :
(
cd /parent/folder || exit
unset -v IFS
read skip_header <&3
ret=0
while read src dst rest_ignored <&3; do
mv -- "$src" "$dst" || ret=$?
done
exit "$ret"
) 3< file
Novamente, para read e com o valor padrão de $IFS (ou depois de unset IFS ), as palavras são separadas por espaço ou tabulação. \ pode ser usado para escapar deles ou de si mesmo ou continuar linhas na próxima linha física.
Para arquivos CSV
Se o arquivo for CSV (valores separados por , e possivelmente cercados por aspas), você poderá executar esse loop no shell ksh93 e usar a opção -S de seu read construído para Análise de CSV:
#! /bin/ksh93 -
(
cd /parent/folder || exit
IFS=,
read -S skip_header <&3
ret=0
while read -S src dst rest_ignored <&3; do
mv -- "$src" "$dst" || ret=$?
done
exit "$ret"
) 3< file
Você pode retirar a opção -S para que ela também funcione em outros shells POSIX como bash , o que funcionaria contanto que o CSV não seja usado no arquivo.
Ou você pode usar um módulo de análise de CSV em perl ou outra linguagem de script:
(cd /parent/folder && perl -C -MText::CSV -e '
$c = Text::CSV->new;
$ret = 0;
$c->getline(STDIN); # skip header
while (($src, $dst) = @{$c->getline(STDIN)}) {
system "mv", "--", $src, $dst;
$ret = 1 if $?;
}
exit $ret;') < file