Copie arquivos específicos (cujos nomes são salvos em uma lista) de uma pasta para outra

3

Eu tenho quase 4 lakhs (400.000) de arquivos em uma pasta chamada model e desta pasta eu selecionei alguns milhares de arquivos e seus nomes foram salvos em id.txt . Agora quero pegar apenas os arquivos listados em id.txt da pasta model e copiá-los para outra pasta chamada selected_ids .

As duas pastas estão presentes no mesmo diretório test que contém

  1. modelo
  2. selected_ids
  3. id.txt

id.txt contém nomes de arquivo um por um por exemplo:

ENSP00000290866.4_2.pdb.xz
385719215_2.pdb.xz
GENSCAN00000006392_3.pdb.xz

A pasta Modelo contém quase 3 arquivos lakh

ENSP00000290866.4_2.pdb.xz
385719215_2.pdb.xz
GENSCAN00000006392_3.pdb

* note: na pasta alguns arquivos possuem extensão .pdb.xz e alguns apenas .pdb

Eu sei copiar um único arquivo de uma pasta para outra assim

cp model/ENSP00000290866.4_2.pdb.xz selected_ids/

Mas tenho milhares e milhares de arquivos para copiar em pouco tempo.

Alguém pode dar algum comando eficiente para copiar os arquivos?

    
por Nitha 19.07.2017 / 21:22

3 respostas

4

o comando que você está procurando é o seguinte,

cd /path/to/model
$ xargs -d '\n' -a /path/to/id.txt cp -t /path/to/selected_ids

isto irá ler o nome dos arquivos salvos em id.txt e copiar para o diretório selected_ids.

    
por αғsнιη 19.07.2017 / 21:56
0

Use while IFS= read -r variable; do... done < input.txt structure para ler o arquivo linha por linha e executar o código desejado em ... part. Esta é uma maneira padrão bash de ler o arquivo linha por linha e agir sobre ele. Com o diretório, como você descreveu, deve ser feito da seguinte forma:

$ tree                                                                                                                                               
.
├── 385719215_2.pdb.xz
├── ENSP00000290866.4_2.pdb.xz
├── GENSCAN00000006392_3.pdb.xz
├── id.txt
├── model
└── selected_ids

2 directories, 4 files
$ while IFS= read -r file; do cp "$file" selected_ids/"$file" ;done < id.txt                                                                         
$ tree
.
├── 385719215_2.pdb.xz
├── ENSP00000290866.4_2.pdb.xz
├── GENSCAN00000006392_3.pdb.xz
├── id.txt
├── model
└── selected_ids
    ├── 385719215_2.pdb.xz
    ├── ENSP00000290866.4_2.pdb.xz
    └── GENSCAN00000006392_3.pdb.xz
    
por Sergiy Kolodyazhnyy 23.07.2017 / 11:27
0

Supondo que não haja espaços em branco no arquivo de entrada, você pode simplesmente usar for loop:

for f in $(<id.txt); do cp -v "model/$f" selected_ids/;done

Se você tiver problemas com "\ r" no final dos nomes dos arquivos (o arquivo mais provável foi salvo no SO da família Windows), também será necessário cortar a variável $f :

for f in $(<id.txt); do f='echo $f|tr -d "\n\r"'; cp -v "model/$f" selected_ids/; done

Observe que cp com a opção -v exibirá o arquivo atual sendo copiado, por isso é fácil verificar esse processo de cópia em lote.

    
por madneon 28.07.2017 / 23:05