Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式在bash中查找和复制(保留文件夹结构)?_Bash_Find - Fatal编程技术网

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

正则表达式在bash中查找和复制(保留文件夹结构)?,bash,find,Bash,Find,我有一个文件夹,里面有一堆日志文件。每组日志文件都位于一个文件夹中,详细说明了程序运行的时间和日期。在这些日志文件夹中,我有一些要提取的视频文件。我只想要视频文件,别的什么都不要。我尝试使用此命令仅复制视频文件,但由于不存在目录,因此无法工作 .rmv是我想要的文件的文件扩展名 $ find . -regex ".*\.rmv" -type f -exec cp '{}' /copy/to/here/'{}' 如果我有一个文件夹结构,例如: |--root | |--fol

我有一个文件夹,里面有一堆日志文件。每组日志文件都位于一个文件夹中,详细说明了程序运行的时间和日期。在这些日志文件夹中,我有一些要提取的视频文件。我只想要视频文件,别的什么都不要。我尝试使用此命令仅复制视频文件,但由于不存在目录,因此无法工作

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

$ find . -regex ".*\.rmv" -type f -exec cp '{}' /copy/to/here/'{}'
如果我有一个文件夹结构,例如:

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

我怎样才能让它复制到目标目录中的folder1和folder2的结构?

假设
src
是您的
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
并从根目录上运行
/cp.sh

输出:

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

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

{}
表示找到的文件的完整路径,因此您的
cp
命令将评估以下内容:

cp /root/folder1/file.rmv /copy/to/here/root/folder1/file.rmv
如果您只删除第二个
{}
,它将被删除

cp /root/folder1/file.rmv /copy/to/here
将文件复制到cp的目录形式,这应该可以实现

此外,您可以使用
-name
操作数,而不是
-regex

find root -name '*.rmv' -type f -exec cp {} /copy/to/here \;
我只想用。

cp有个论点——父母 因此,做你想做的事情的最短方法是:

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

如果名称中有空格,这将不起作用。使用
find…|当读取f…
时。此外,出于同样的原因,您应该引用文件名变量:
“$f”
“$path”
。使用此选项:
echo“$f->$path”
-更具可读性。如果您的shell支持它(大多数都支持),请使用
$()
而不是。顺便说一下,这些分号都不是必需的。这不起作用,因为它不保留文件夹结构。在文件夹中,一些文件的名称相同。所以我没有得到所有的文件,因为有些文件一直被覆盖。如果我使用rsync,然后在它被复制到的目录上运行rmdir,这是可行的(因为它创建的文件夹中没有任何内容)。我使用命令:“rsync-rv root copy/to/here--exclude=“.log”--include=“.rmv””目录中的其他文件只有.log文件。出于某种原因,如果我只指定include,它仍然会复制所有文件。谢谢。@Jonathan:看看
--prune empty dirs
--delete*
选项是否有用。