我想在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
这可行,但是它将所有文件复制到那里,没有特定扩展名的歧视。
出什么问题了?
答案 0 :(得分:2)
解决问题的一种简单方法是使用find
和regex
:
find src/ -regex '.*\.\(tsv\|xlsx\|gz\|html\)$' -exec cp {} dest/ \;
find
在指定目录中递归查找(在我的示例中为src /),允许您使用-regex
进行过滤,并应用命令以匹配-exec
的结果>
对于正则表达式部分:
.*\.
将使用文件名和扩展名前的句点
\(tsv\|xlsx\|gz\|html\)$
使用所需的扩展名进行验证。
exec块是您处理从正则表达式获取的文件的
-exec cp {} dest/ \;
在这种情况下,您将获得的内容({}
含义)复制到目标目录。