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