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.
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
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?
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.
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
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.
Tags command-line