使用find标识与父目录名称相同的文件名

时间:2019-01-09 11:04:49

标签: regex linux find

我想使用find来搜索不同子目录中的文件,这些子目录必须与其父类别匹配相同的模式。

示例:

ls
Random1_fa  Random2_fa  Random3_fa

在这些目录中,我仅搜索每个文件中的一个:

cd Random1_fa
Random1.fa
Random1.fastq
Random1_match_genome.fa
Random1_unmatch_genome.fa
...

我只想“查找”带有“文件名”的文件。例如:

/foo/bar/1_Random1/Random1_fa/Random1.fa
/foo/bar/2_Random2/Random2_fa/Random2.fa
/foo/bar/3_Random5/Random5_fa/Random5.fa
/foo/bar/10_Random99/Random99_fa/Random99.fa

我做到了:

ls | sed 's/_fa//' |find -name "*.fa"

但不是我想要的。 我想将sed的结果重定向为find中的正则表达式模式。 类似于“ awk”的东西:

ls| sed 's/_fa//' |find -name "$1.fa"

ls| sed 's/_fa/.fa/' |find -name "$1"

1 个答案:

答案 0 :(得分:1)

当您可以直接使用sed进行正则表达式条件时,为什么要使用find从标准输入中读取内容以排除文件。首先,对所有以_fa结尾的目录运行一个shell glob扩展,并将字符串名称命名为find以在find表达式中使用。您需要做的就是

for dir in ./*_fa; do 
    # Ignore un-expanded globs from the for-loop. The un-expanded string woul fail
    # to match the condition for a directory(-d), so we exit the loop in case
    # we find no files to match
    [ -d "$dir" ] || continue
    # The filename from the glob expansion is returned as './name.fa'. Using the
    # built-in parameter expansion we remove the './' and '_fa' from the name
    str="${dir##./}"
    regex="${str%%_fa}"
    # We then use 'find' to identify the file as 'name.fa' in the directory
    find "$dir" -type f -name "${regex}.fa"
done

以下内容将匹配仅包含[A-Za-z0-9]并以.fa结尾的文件名。在包含您的目录的顶层运行此命令以匹配所有文件。

要将文件复制到其他位置,请添加以下内容

find "$dir" -type f -name "${regex}.fa" -exec cp -t /home/destinationPath {} +