复杂的文件复制和重命名

复杂的文件复制和重命名

我在特定目录中有很多文件。例如:

  • 我有一个目录:/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

相关内容