У меня есть почти 4 лакха (400,000) из файлов в названной папке model
и от этой папки я выбрал несколько тысяч файлов, и их имена сохраняются в id.txt
. Теперь я хочу взять только файлы, перечисленные в id.txt
от папки model
и скопируйте их в другую названную папку selected_ids
.
Эти две папки присутствуют в том же каталоге test
который содержит
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/
Но у меня есть тысячи и тысячи файлов для копирования в короткое время.
Кто-либо может дать некоторую эффективную команду для копирования файлов?
команда Вы смотрите, следующим образом,
cd /path/to/model
$ xargs -d '\n' -a /path/to/id.txt cp -t /path/to/selected_ids
это считает имя файлов, сохраненное в id.txt, и скопирует в selected_ids каталог.
Использовать 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
Принятие там не является никакими пробелами во входном файле, который можно просто использовать 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
отобразит текущий скопированный файл, таким образом, его легкое для проверки этого процесса копирования пакета.