如何在 bash 中递归复制具有多个特定扩展名的文件

How to copy recursively files with multiple specific extensions in bash

我想在 bash 中递归复制具有特定扩展名的所有文件。

****编辑****

我已经写好了完整的剧本。我在 csv 文件中有名称列表,我正在遍历该列表中的每个名称,然后在其他地方创建一个具有相同名称的目录,然后我在我的源目录中搜索具有该名称的目录,在它里面几乎没有以 xlsx,tsv,html,gz 结尾的文件,我正在尝试将它们全部复制到新创建的目录中。

sample_list_filepath=/home/lists/papers
destination_path=/home/ds/samples
source_directories_path=/home/papers_final/new

cat $sample_list_filepath/sample_list.csv | while read line
 do
    echo $line
    cd $source_directories_path/$line
    cp -r *.{tsv,xlsx,html,gz} $source_directories_path/$line $destination_path

done

这行得通,但它会将所有文件复制到那里,不区分特定扩展名。

问题是什么?

解决问题的一个简单方法是使用 findregex :

find src/ -regex '.*\.\(tsv\|xlsx\|gz\|html\)$' -exec cp {} dest/ \;

find 在您指定的目录中递归查找(在我的示例中是 src/),允许您使用 -regex 进行过滤并应用命令以使用 -exec 匹配结果

对于正则表达式部分:

.*\.

取文件名和扩展名前的点,

\(tsv\|xlsx\|gz\|html\)$

用你想要的验证扩展。

exec 块是您对从正则表达式获得的文件执行的操作

-exec cp {} dest/ \;

在这种情况下,您将获得的内容({} 意思)复制到目标目录。