提取具有特定文件扩展名的文件并保留目录结构?

提取具有特定文件扩展名的文件并保留目录结构?

我有很多 .CR2 和 .ARW 文件混合在一个按日期构造的目录中(2016 年有文件夹 06 和 07,其中每一天都有一个文件夹。因此文件可能位于 2016/06/03例如)。

我想将 .ARW 文件提取到一个单独的文件夹中,同时保留结构。这可能吗?

也就是说,我想要两个具有相同结构的 2016 文件夹,但其中一个文件夹中只能有 .ARW 文件,而一个文件夹中只能有 .CR2 文件。

答案1

这些 rsync 命令应该可以满足您的要求

这将执行ARW

rsync -arvz --progress --include='*.ARW' --include="*/" --exclude="*" ./source-dir-2016 ./target-ARW-2016

这会做CR2

rsync -arvz --progress --include='*.CR2' --include="*/" --exclude="*" ./source-dir-2016 ./target-CR2-2016

我用了这个帖子作为信息来源。

答案2

find exec我会建议使用和的替代方案cp --parents

find ./ -name *.ARW -exec cp --parents {} /home/user/target-ARW-dir/ \;
find ./ -name *.CR2 -exec cp --parents {} /home/user/target-CR2-dir/ \;

这样做的限制是您的工作目录必须位于要复制的文件结构之上。


它的作用的想法:

find查找文件

./它将查找的目录

-name *.ARW只列出以 .ARW 结尾的文件

-exec对返回的文件列表执行命令

cp --parents复制并维护目录结构

{}扩展到每个文件find报告,将其想象xfor x in $files

/home/user/target-ARW-dir/只是一个示例目录,您应该将其更改为您真正想要的目录

\;终止 a 的正确方法,find -exec使其像 for 循环一样

答案3

cp递归地从2016dir 到 a ,然后2016_ARW从main 开始,怎么样?rm *.CR2rm *.ARW

例如

user:~$ ls 2016/06/03/
file_one.ARW file_two.CR2 file_three.CR2 file_four.ARW file_five.ARW
user:~$ cp -R 2016 2016_ARW
user:~$ rm 2016_ARW/06/03/*.CR2
user:~$ rm 2016/06/03/*.ARW
user:~$ ls 2016/06/03/
file_two.CR2 file_three.CR2
user:~$ ls 2016_ARW/06/03/
file_one.ARW file_four.ARW file_five.ARW

相关内容