Mover a pasta para outra pasta com base em sua correspondência

0

Eu tenho um arquivo de texto como tal:

    Order,Site_ID
[email protected],AR-Slu

A coluna 'Ordem' contém o nome da pasta que eu quero mover para a pasta correspondente (mesma linha no arquivo de texto) que é mostrada na coluna 'Site_ID'. Este é um exemplo para apenas uma pasta a ser movida. Neste exemplo, quero mover a pasta'[email protected] 'para a pasta' AR-Slu '. As informações contidas na tabela são o nome da pasta, mas não possuem informações de caminho das pastas. No entanto, as duas pastas estão na mesma pasta pai. Alguém saberia como fazer isso?

    
por SimonB 20.10.2016 / 15:35

1 resposta

1

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
    
por 20.10.2016 / 15:41