Eu tenho milhões de arquivos xml em uma pasta. O nome dos arquivos segue um padrão específico:
ABC_20190101011030931_6049414.xml
Neste estou interessado apenas no último conjunto de dígitos antes de xml 6049414
. Eu tenho uma lista de cerca de 8000 desses números em um arquivo de texto. Os detalhes no arquivo de texto são os seguintes - um número em uma linha:
104638
222885
108880071
Estou usando o seguinte código para mover os arquivos da pasta que corresponde ao número fornecido no arquivo de texto:
#folder where the xml files are stored
cd /home/iris/filesToExtract
SECONDS=0
#This line reads each number in the hdpvr.txt file and if a match is found moves that file to another folder called xmlfiles.
nn=($(cat /home/iris/hdpvr.txt));for x in "${nn[@]}";do ls *.xml| grep "$x"| xargs -I '{}' cp {} /home/iris/xmlfiles;done
#this line deletes all the other xml files from filesToExtract folder
find . -name "*.xml" -delete
echo $SECONDS
Estou enfrentando dois problemas. 1 Alguns dos arquivos não estão sendo movidos apesar de haver uma correspondência e 2. Mesmo que a correspondência seja encontrada na parte do meio do nome do arquivo, por exemplo
from this ABC_20190101011030931_6049414.xml -> this 20190101011030931
se uma correspondência for encontrada, ela ainda se move... como posso obter as correspondências exatas e mover os arquivos.
Outra solução, graças a glenn jackmann !
Padrão
*_*_${line}.xml
é usado para localizar os arquivos no diretório.Substitua
rm -i *.xml
porrm *.xml
se desejar excluir os arquivos xml restantes imediatamente.Algo assim faria o trabalho?
Você também pode fazer isso de maneira brutal com mv, mas ele lançará erros se um arquivo não for encontrado