我想使用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"
答案 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 {} +