【问题标题】:How to copy recursively files with multiple specific extensions in bash如何在bash中递归复制具有多个特定扩展名的文件
【发布时间】:2019-10-13 08:49:58
【问题描述】:

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

这可行,但它会复制那里的所有文件,不区分特定扩展名。

有什么问题?

【问题讨论】:

  • 这是干什么用的? $source_directories_path/$line
  • “递归”是什么意思。仅当至少一个源参数是目录时,您的命令才会递归
  • 我已经对其进行了编辑以使其更清晰

标签: bash cp


【解决方案1】:

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

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

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

对于正则表达式部分:

.*\.

将采用文件名和扩展名前的点,

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

与您想要的人一起验证扩展程序。

exec 块是您对从 regex 获得的文件执行的操作

-exec cp {} dest/ \;

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

【讨论】:

  • 在我创建了一个目标目录之后就可以完美运行了。谢谢!
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2020-06-02
相关资源
最近更新 更多