processando muitas imagens que possuem seus nomes armazenados em um arquivo csv do terminal

0

Como posso copiar todas as imagens na segunda coluna de um arquivo CSV e colocá-las em uma nova pasta chamada imagens? Tem cerca de 300k imagens, então eu me pergunto se há um caminho rápido para isso (como eu tenho 12 processadores):

[jalal@goku cleaned_affenet_manually_annotated]$ head -5 modified_training_for_FER2013.csv 
,subDirectory_filePath,expression
0,689/737db2483489148d783ef278f43f486c0a97e140fc4b6b61b84363ca.jpg,3
1,392/c4db2f9b7e4b422d14b6e038f0cdc3ecee239b55326e9181ee4520f9.jpg,6
2,468/21772b68dc8c2a11678c8739eca33adb6ccc658600e4da2224080603.jpg,6
3,944/06e9ae8d3b240eb68fa60534783eacafce2def60a86042f9b7d59544.jpg,3
[jalal@goku cleaned_affenet_manually_annotated]$ wc -l modified_training_for_FER2013.csv 
283903 modified_training_for_FER2013.csv
    
por Mona Jalal 03.12.2017 / 20:14

2 respostas

0

echo ",subDirectory_filePath,expression
0,689/737db2483489148d783ef278f43f486c0a97e140fc4b6b61b84363ca.jpg,3
1,392/c4db2f9b7e4b422d14b6e038f0cdc3ecee239b55326e9181ee4520f9.jpg,6
2,468/21772b68dc8c2a11678c8739eca33adb6ccc658600e4da2224080603.jpg,6
3,944/06e9ae8d3b240eb68fa60534783eacafce2def60a86042f9b7d59544.jpg,3
" |  sed -r '1d;s/,(.*\.jpg),.*//' | while read f; do echo "copy $f to dir/$f"; done 
  • 1d; apaga a primeira linha (título).
  • s / from / to / substitui o nome do arquivo pelo prefixo postfix por um nome de arquivo puro.
  • O loop while-ecoa um comando de cópia, mas também pode fazer a cópia.

Talvez os nomes dos diretórios não existam (689, 392, ...). Se você quiser nivelar a hierarquia de arquivos, isso é possível, mas pode levar a substituições. cp --parents gera o (s) diretório (s) pai (s) se eles não existirem, afaik.

Trabalhar diretamente no caminho seria parecido com

sed -r '...' modified_training_for_FER2013.csv | while ...

O uso de 12 processadores não ajudará muito, afaik, já que o afunilamento deve ser o uso de unidade de disco rígido, arquivo-IO.

    
por user unknown 04.12.2017 / 04:04
0

Isso deve ajudar:

sed -r '1d;$d; s/^.*\/(.*\.jpg),.//g' mona.csv | xargs -i cp {} /path/to/images

Caso os arquivos estejam em outro local, mas tenham seus nomes no arquivo csv , mova-os:

sed -r '1d;$d; s/^.*\/(.*\.jpg),.//g' mona.csv | xargs -i cp /path/to/files/{} /path/to/images

Informação:

  1. 1d;1$ : exclui as primeiras e últimas linhas
por George Udosen 04.12.2017 / 04:59