正则表达式在bash中查找并复制(保留文件夹结构)?

时间:2010-05-15 06:11:41

标签: bash find

我有一个包含大量日志文件的文件夹。每组日志文件都在一个文件夹中,详细说明了程序运行的时间和日期。在这些日志文件夹中,我有一些我想要提取的视频文件。我想要的只是视频文件,没有别的。我尝试使用此命令仅复制视频文件,但由于目录不存在而无效。

.rmv是我想要的文件的文件扩展名。

$ find . -regex ".*\.rmv" -type f -exec cp '{}' /copy/to/here/'{}'

如果我有一个文件夹结构,例如:

|--root  
   |  
   |--folder1  
   |  |  
   |  |--file.rmv  
   |  
   |--folder2  
      |  
      |--file2.rmv  

如何在目的地目录中复制folder1和folder2的结构,将其复制到/复制到此处?

4 个答案:

答案 0 :(得分:12)

cp有参数--parents 所以做你想做的最短的方法是:

find root -name '*.rmv' -type f -exec cp --parents "{}" /copy/to/here \;

答案 1 :(得分:2)

我只会使用rsync

答案 2 :(得分:1)

{}表示找到的文件的完整路径,因此您的cp命令会评估此类事情:

cp /root/folder1/file.rmv /copy/to/here/root/folder1/file.rmv

如果您只是放弃第二个{},则会改为

cp /root/folder1/file.rmv /copy/to/here

cp的copy-file-to-directory形式,应该可以解决问题。

此外,您可以使用-regex操作数代替-name,而不是find root -name '*.rmv' -type f -exec cp {} /copy/to/here \;

{{1}}

答案 3 :(得分:0)

假设srcrootdst/copy/to/here

#!/bin/sh

find . -name *.rmv | while read f
do
       path=$(dirname "$f" | sed -re 's/src(\/)?/dst\1/')
       echo "$f -> $path"
       mkdir -p "$path"
       cp "$f" "$path"
done

将其放在cp.sh并通过root

目录运行./cp.sh

输出:

./src/folder1/file.rmv -> ./dst/folder1
./src/My File.rmv -> ./dst
./src/folder2/file2.rmv -> ./dst/folder2

编辑:改进的脚本版本(感谢评论)