Скопируйте конкретные файлы (чьи имена сохраняются в списке) от одной папки до другого

У меня есть почти 4 лакха (400,000) из файлов в названной папке model и от этой папки я выбрал несколько тысяч файлов, и их имена сохраняются в id.txt. Теперь я хочу взять только файлы, перечисленные в id.txt от папки model и скопируйте их в другую названную папку selected_ids.

Эти две папки присутствуют в том же каталоге test который содержит

  1. модель
  2. selected_ids
  3. id.txt

id.txt содержит имена файлов один за другим, например:

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

Образцовая папка содержит файлы почти на 3 лакха

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

*примечание: в папке некоторые файлы имеют .pdb.xz расширение и некоторых только .pdb

Я знаю, как скопировать единственный файл от одной папки до другого как это

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

Но у меня есть тысячи и тысячи файлов для копирования в короткое время.

Кто-либо может дать некоторую эффективную команду для копирования файлов?

3
задан 23 July 2017 в 12:10

3 ответа

команда Вы смотрите, следующим образом,

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

это считает имя файлов, сохраненное в id.txt, и скопирует в selected_ids каталог.

4
ответ дан 1 December 2019 в 15:51

Использовать while IFS= read -r variable; do... done < input.txt структура, чтобы считать файл линию за линией и выполнить желаемый код в ... часть. Это - стандарт bash способ считать файл линию за линией и реагировать на него. С каталогом, поскольку Вы описали, он должен быть сделан как так:

$ 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
0
ответ дан 1 December 2019 в 15:51

Принятие там не является никакими пробелами во входном файле, который можно просто использовать for цикл:

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

Если Вы испытывающий затруднения из-за "\r" в конце имен файлов (наиболее вероятный файл был сохранен в семействе Windows ОС), также необходимо обрезать переменную $f:

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

Отметьте это cp с опцией -v отобразит текущий скопированный файл, таким образом, его легкое для проверки этого процесса копирования пакета.

0
ответ дан 1 December 2019 в 15:51

Другие вопросы по тегам:

Похожие вопросы: