Pula a primeira linha (ou mais) no arquivo CSV que é usado para renomear arquivos

3

Eu usei as informações de outra pergunta no Stack Exchange para permitir a renomeação de arquivos usando as informações em um arquivo csv. Esta linha permite que eu renomeie todos os arquivos dos nomes na coluna 1 para os nomes na coluna 2.

while IFS=, read -r -a arr; do mv "${arr[@]}"; done <$spreadsheet 

No entanto, tenta comparar as informações na linha superior. Eu gostaria de poder incluir algum código que me permita pular linhas. Também seria bom entender melhor como funciona a linha de código acima. Eu teria pensado que incluiria alguma informação sobre colunas (ie. A e B)

    
por neilH 15.10.2015 / 17:04

1 resposta

6

Tente isto:

tail -n +2 $spreadsheet | while IFS=, read -r -a arr; do mv "${arr[@]}"; done

O comando tail imprime apenas as últimas linhas de um arquivo. Com o "-n +2", imprime todas as últimas linhas do arquivo a partir do segundo.

Mais no loop while. Os loops while executam o comando mv , desde que haja novas linhas disponíveis. Ele faz isso usando a condição do loop while:

IFS=, read -r -a arr

O que o acima faz é ler uma linha em uma matriz chamada arr , onde o separador de campos (IFS) é uma vírgula. A opção -r provavelmente não é necessária.

Então, ao executar o comando mv , "$ {arr [@]}" é convertido na lista de campos onde cada campo é separado por aspas duplas. No seu caso, existem apenas dois campos por linha, então é expandido apenas para os dois campos. O "$ {arr [@]}" é uma convenção especial usada pelo bash para Arrays, conforme explicado no manual:

   Any element of an array may be referenced using ${name[subscript]}.  The braces are
   required  to  avoid conflicts with pathname expansion.  If subscript is @ or *, the
   word expands to all members of name.  These subscripts differ only  when  the  word
   appears  within double quotes.  If the word is double-quoted, ${name[*]} expands to
   a single word with the value of each array member separated by the first  character
   of the IFS special variable, and ${name[@]} expands each element of name to a sepa-
   rate word.  When there are no array members, ${name[@]} expands to nothing.  If the
   double-quoted  expansion occurs within a word, the expansion of the first parameter
   is joined with the beginning part of the original word, and the  expansion  of  the
   last  parameter  is joined with the last part of the original word.  This is analo-
   gous to the expansion of the special parameters * and  @  (see  Special  Parameters
   above).   ${#name[subscript]} expands to the length of ${name[subscript]}.  If sub-
   script is * or @, the expansion is the number of elements in the array.   Referenc-
   ing  an  array  variable  without  a subscript is equivalent to referencing element
   zero.
    
por 15.10.2015 / 17:09