将特定文件(其名称保存在列表中)从一个文件夹复制到另一个文件夹

将特定文件(其名称保存在列表中)从一个文件夹复制到另一个文件夹

我在一个名为的文件夹中有近 40 万(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

模型文件夹包含近 30 万个文件

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

*注意:文件夹中有些文件有 .pdb.xz 扩展名,有些只有 .pdb

我知道如何将单个文件从一个文件夹复制到另一个文件夹,如下所示

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

但我在短时间内需要复制成千上万个文件。

有人可以提供一些有效的命令来复制文件吗?

答案1

您正在寻找的命令如下,

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

这将读取 id.txt 中保存的文件名并复制到 selected_ids 目录。

答案2

使用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

答案3

假设输入文件中没有空格,您可以简单地使用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将显示当前正在复制的文件,因此很容易验证此批量复制过程。

相关内容