我在一个名为的文件夹中有近 40 万(400,000)个文件model
,从这个文件夹中我选择了几千个文件,并将它们的名称保存在中id.txt
。现在我只想id.txt
从文件夹中取出列出的文件model
并将它们复制到另一个名为的文件夹中selected_ids
。
这两个文件夹位于同一目录中test
,其中包含
- 模型
- selected_ids
- 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
将显示当前正在复制的文件,因此很容易验证此批量复制过程。