我在特定目录中有很多文件。例如:
- 我有一个目录:
/home/scrivania/pdb_files
内容:UN4_A.pdb VIV_A.pdb XMG_A.pdb Z34_A.pdb ZAR_A.pdb ZTW_B.pdb
- 此外,我在文件 ( ) 中有一个这样的对象列表
"list.txt"
:VIV XMG ZTW
/home/scrivania/news/
我只想将文件中存在的文件从工作目录复制到另一个目录"list.txt"
。
在目录的最后,news
我只需要这 3 个文件:
VIV_A.pdb
XMG_A.pdb
ZTW_B.pdb
另外,使用与第一个脚本不同的另一个脚本,我想仅使用每个文件的前三个字符和扩展名(.pdb)重命名新目录中的文件。因此,最后目录的内容必须如下所示:
VIV.pdb
XMG.pdb
ZTW.pdb
有人可以帮我吗?谢谢
答案1
如果文件名根位于外部文件中,则可以使用 bash 循环来迭代其内容:
#!/bin/bash
shopt -s nullglob
sourcedir=/home/scrivania/pdb_files
targetdir=/home/scrivania/news/
while IFS= read -r froot
do
for file in "$sourcedir/$froot"*.pdb
do
cp "$file" "$targetdir/$froot.pdb"
done
done < list.txt
- 这将迭代文件中的条目,然后循环遍历以指示的三个字母开头并以
.pdb
.由于您声明源目录中只有一个这样的文件,因此该内部for
循环将用于从list.txt
.确保shopt -s nullglob
在(不太可能)不存在此类文件的情况下,循环不会偶然发现它。 - 在“内部”
for
循环中,脚本会将文件复制到目标目录。在当前形式下,它会在按照您指定的方式复制时重命名文件。如果这不是您想要的,请将行更改为
并在第二个脚本中进行重命名。cp "$file" "$targetdir"
- 如果您非常确定总会有一个文件以您的三个字母开头,您可以省略循环
for
并将其替换为cp "$sourcedir/$froot"*.pdb "$targetdir/$froot.pdb"
答案2
#!/bin/bash 输入=“文件.txt” 而 IFS= 读取 -r 行 做 /bin/cp "${line}_A.pdb" "/home/scrivania/news/${line}.pdb" 完毕
应该做。
答案3
#!/usr/bin/sh
for XXX in $(cat list.txt)
do
cp /tmp/home/scrivania/pdb_files/${XXX}*.pdb /tmp/home/scrivania/news/$XXX.pdb
done