我有一个包含子文件夹的文件夹。在这些子文件夹中都有.jpg和.mov文件。
我想要做的是将树复制到另一个根文件夹,但只包含.mov文件。
是否有一个我可以发出的终端命令会像魔术那样做?我希望那里有一个像忍者一样的技能的linux大师可以为我节省很多时间。
示例:
当前:
Pictures
-- 2014
----- January
--------- file1.jpg
--------- file1.mov
----- February
--------- file1.jpg
--------- file1.mov
----- March
--------- file1.jpg
--------- file2.jpg
----- April
--------- file1.mov
--------- file2.mov
Desired:
Pictures
-- 2014
----- January
--------- file1.jpg
----- February
--------- file1.jpg
----- March
--------- file1.jpg
--------- file2.jpg
Movies
-- 2014
----- January
--------- file1.mov
----- February
--------- file1.mov
----- April
--------- file1.mov
--------- file2.mov
答案 0 :(得分:1)
我建议使用rsync
,我希望OS X上的语法相同
rsync -vrR --include="*.jpg" --include="*/" --exclude="*" /path/to/source /path/to/target
由于目标目标不同,您需要为* .mov和* .jpg运行两个单独的命令
答案 1 :(得分:1)
我会将find
与dirname
一起使用。应该在Linux和MacOS中以相同的方式工作。这是一个应该在bash
中运行的shell脚本。
注意:以确保您没有在错误的位置或$source
和$target
的错误值运行它我用{{1}为所有基本命令加前缀这样它将打印命令,而不是执行它。确保它符合您的预期,然后移除所有echo
(例如,仅使用echo
替换echo mkdir ...
)。在编写复杂的shell脚本时,这是一种常见的预防措施。
mkdir ...
这里我们遍历source="/path/to/source"
target="/path/to/target"
cd "$source"
find . -type f -name '*.mov' |
while read fn ; do
path=`dirname $fn`
echo mkdir -p "$target/$path" # -p is essential here
echo cp "$fn" "$target/$path/"
done
目录中的*.mov
文件列表,对于每个文件,我们使用$source
提取目录名称。然后我们使用dirname
在$target
中创建相应的子目录(这将创建所有必需的子目录,如果目录已经存在则不会失败)并最终复制文件。
答案 2 :(得分:0)
如果它会帮助某人,我实际上找到了一个不需要命令行的简单解决方案。我使用FreeFileSync将文件复制到新树,然后返回并使用finder删除复制过的文件。仍然是一个两步过程,但它很简单,因为它没有使用命令行。
FreeFileSync具有过滤功能,因此我只能隔离要复制的视频。
从图片文件夹中删除视频就像使用finder的搜索功能和仅对视频文件类型进行过滤一样简单。然后一次删除就把它们全部杀了。