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

时间:2019-05-27 19:56:11

标签: bash cp

我想在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

这可行,但是它将所有文件复制到那里,没有特定扩展名的歧视。

出什么问题了?

1 个答案:

答案 0 :(得分:2)

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

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

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

对于正则表达式部分:

.*\.

将使用文件名和扩展名前的句点

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

使用所需的扩展名进行验证。

exec块是您处理从正则表达式获取的文件的

-exec cp {} dest/ \;

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