我有一个包含大量日志文件的文件夹。每组日志文件都在一个文件夹中,详细说明了程序运行的时间和日期。在这些日志文件夹中,我有一些我想要提取的视频文件。我想要的只是视频文件,没有别的。我尝试使用此命令仅复制视频文件,但由于目录不存在而无效。
.rmv是我想要的文件的文件扩展名。
$ find . -regex ".*\.rmv" -type f -exec cp '{}' /copy/to/here/'{}'
如果我有一个文件夹结构,例如:
|--root
|
|--folder1
| |
| |--file.rmv
|
|--folder2
|
|--file2.rmv
如何在目的地目录中复制folder1和folder2的结构,将其复制到/复制到此处?
答案 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)
假设src
是root
而dst
是/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
编辑:改进的脚本版本(感谢评论)