【问题标题】:Use a text file (containing file names) to copy files from current directory to new directory使用文本文件(包含文件名)将文件从当前目录复制到新目录
【发布时间】:2020-01-23 17:10:16
【问题描述】:

我创建了一个文件 (search.txt),其中包含我要从当前目录复制的 .fasta 文件的文件名(其中还包含许多不需要的 .fasta 文件)。是否可以使用此文本文件在当前目录中查找匹配文件并将其复制到新位置?

search.txt 文件包含如下名称列表:

name_1
name_2
name_3

我尝试使用 find 和 grep 构建搜索词,如下所示:

find . *.fasta | grep -f search.txt

为每个匹配的文件返回这样的输出:

./name_1.fasta
./name_2.fasta
./name_3.fasta
name_1.fasta
name_2.fasta
name_3.fasta

它正在查找正确的文件,但我不确定此输出是否有用/可用于复制这些文件?

【问题讨论】:

    标签: linux grep


    【解决方案1】:

    要从 search.txt 中只获取匹配的文件名,我会这样做:

    find . -type f -name '*.fasta' -print0 | grep -zf search.txt | xargs -r0 cp -t target-dir/
    

    它将查找所有扩展名为 .fasta 的文件,仅显示 search.txt 中匹配模式的文件,并将它们批量 cp 到 target-dir,如果文件名包含换行符,每个文件名都以空字节结尾。

    【讨论】:

    • 这对我有用。已接受此作为答案,因为我发现它比 @Benjamin W 更容易理解(这也有效)。
    【解决方案2】:

    使用 Bash,您可以将列表中的所有文件读入一个数组:

    $ mapfile -t files < search.txt
    $ declare -p files
    declare -a files=([0]="name_1" [1]="name_2" [2]="name_3")
    

    然后,您可以将所需的文件扩展名附加到所有数组元素:

    $ files=("${files[@]/%/.fasta}")
    $ declare -p files
    declare -a files=([0]="name_1.fasta" [1]="name_2.fasta" [2]="name_3.fasta")
    

    最后,将它们移动到所需的位置:

    $ mv "${files[@]}" path/to/new/location
    

    您实际上并不需要中间步骤:

    mapfile -t files < search.txt
    mv "${files[@]/%/.fasta}" path/to/new/location
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2023-04-02
      • 2021-10-25
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多