Mova todos os arquivos com prefixos correspondentes para a pasta com base em uma lista csv

0

Eu tenho milhares de arquivos com vários prefixos, e esses prefixos são agrupados em uma lista csv. Agora quero mover todos eles para a pasta de acordo com a lista deles.

Por exemplo: arquivo A1B1C1 _ {...}. png, A1B2C2 _ {...}. png, A1B1C3 _ {...}. png, etc. Lista de CSV:

Name   Group
A1B1C1 John
A2B1C1 John
A1B2C2 Denver
A1B1C3 Nick

Agora quero mover todos os arquivos com o prefixo A1B1C1_ e A2B1C1_ para a pasta John, o prefixo A1B2C2_ para a pasta Denver, o prefixo A1B1C3_ para a pasta Nick.

Estou pensando em

for group in *_*.csv; 
 do {...}

Mas não tenho certeza sobre como ler a lista de um arquivo csv e também sobre como mover arquivos de uma sintaxe de lista.

Estou trabalhando no CentOS, muito obrigado.

    
por Thanh Nguyen 11.05.2018 / 06:47

2 respostas

0
awk 'NR > 1 { print $1, $2 }' list.csv |
while read -r prefix group; do
    find . -type f -name "$prefix*" -exec sh -c '
        group="$1"; shift
        mkdir -p "$group"
        for name do echo mv "$name" "$group"; done' sh "$group" {} +
done

Isso usaria awk para alimentar um loop while com os prefixos e nomes de grupos (ignorando o cabeçalho do arquivo da lista). Isso pressupõe que todos os prefixos e nomes de grupos não possuem espaços ou tabulações neles.

O loop while chama find para localizar todos os arquivos regulares dentro ou abaixo do diretório atual, que possuem nomes começando com o prefixo especificado. Para todos esses arquivos, o seguinte script de shell curto é chamado:

group="$1"
shift

mkdir -p "$group"
for name do
    echo mv "$name" "$group"
done

Este script espera que o nome do grupo seja o primeiro argumento na linha de comando, e o resto dos argumentos sejam nomes de caminho de arquivos para serem movidos para o diretório do grupo.

O script cria um diretório de grupos no diretório de trabalho atual, se ainda não existir, e, em seguida, faz um loop nos nomes de caminho fornecidos, movendo cada arquivo para o lugar. Nenhuma verificação é feita para se os arquivos são sobrescritos.

O echo protege o mv da execução real. Execute o código com echo no lugar para ter certeza de que funciona, depois remova o echo .

    
por 11.05.2018 / 09:11
0

Script como esse pode fazer o trabalho. Pense no código abaixo como meta-linguagem, só para dar uma ideia de como fazer as coisas!

for i in 'ls *.PNG'
do
a=$(echo $i | awk -F_ '{print $1}')
b=$(grep $a file.csv|awk '{print $2}')
mv $i $b/
done
    
por 11.05.2018 / 08:43