BashScript move os arquivos com base na parte correspondente dos nomes de arquivos de uma lista

0

Eu tenho milhões de arquivos xml. O nome do arquivo xml segue este padrão:

ABC_20180912_12345.xml
ABC_20180412_98765.xml
ABC_20180412_45678.xml

A partir disso eu quero copiar arquivos para uma pasta diferente com base no nome que ele tem após o sublinhado. Para identificar os arquivos, eu tenho uma lista que salvei em um arquivo csv que me fornece os nomes necessários. Um exemplo:

vcfile="/home/mycomp/Documents/wd/vehicles.csv"
vcpvr='cat $vcfile'

echo $ vcpvr me fornece essa lista:

2894 4249 5464

Eu sou capaz de percorrer os xmlfiles na pasta, abrir cada arquivo e o grep para ver se o arquivo contém a string e, se estiver, mover os arquivos para um novo local. Isso está funcionando.

O código completo:

#filesToExtract is the interim folder
fold="/home/mycomp/filesToExtract";
query=$fold/*.xml

vcfile="/home/mycomp/Documents/wd/vehicles.csv"
vcpvr='cat $vcfile'

#xmlfiles - keep all tar.gz files here
cd ~/xmlfiles/
COUNTER=1
for f in *.tar.gz
do
echo " $COUNTER "
  tar zxf "$f" -C ~/filesToExtract
  for k in $query
  do
   file $k | if grep -q "$vcpvr"
   then
   mv $k  ~/xmlToWork/
   fi
   done
#xmltowork is the final folder
#rm -r ~/filesToExtract/*.xml
COUNTER=$((COUNTER + 1))
done

Mas, como isso procura a string dentro do arquivo, em vez do nome do arquivo, leva mais tempo para processar milhões de arquivos. Em vez disso, quero procurar a string no nome do arquivo e, se estiver lá, mova os arquivos. Isso é o que eu tentei:

target="/home/mycomp/xmlToWork"

 for k in $query
  do
  if [[ $k =~ "$vcpvr" ]]; then 
    cp -v $k $target
  fi
  done

Mas isso me dá um erro tarextract.sh: 12: tarextract.sh: [[: not found

    
por Apricot 21.08.2018 / 09:35

1 resposta

0

$ cvfile também é uma lista, não é? Então eu faria:

for k in "$query"
do
    for l in "$cvfile"
    do
        if [[ "$k" =~ "$l" ]]
        then
            cp -v "$k" "$target"
        fi
    done
done
    
por 21.08.2018 / 11:29