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