我有一个目录,其中包含多个带有 mov 和 jpg 文件的子目录。
/dir/
/subdir-a/ # contains a-1.jpg, a-2.jpg, a-1.mov
/subdir-b/ # contains b-1.mov
/subdir-c/ # contains c-1.jpg
/subdir-d/ # contains d-1.mov
... # more directories with the same pattern
我需要找到一种使用命令行工具(最好是在 Mac OSX 上)将所有 mov 文件移动到新位置的方法。但是,一个要求是保持目录结构,即:
/dir/
/subdir-a/ # contains a-1.mov
/subdir-b/ # contains b-1.mov
# NOTE: subdir-c isn't copied because it doesn't have mov files
/subdir-d/ # contains d-1.mov
...
我熟悉find
, grep
, and xargs
但不确定如何解决这个问题。非常感谢您!
最佳答案
这在一定程度上取决于您的操作系统,更具体地说,取决于您的 tar
版本中的功能以及您是否有命令 cpio
。这也有点取决于您的文件名中是否有换行符(特别是);大多数人不会。
选项#1
cd /old-dir
find . -name '*.mov' -print | cpio -pvdumB /new-dir
选项#2
find . -name '*.mov' -print | tar -c -f - -T - |
(cd /new-dir; tar -xf -)
cpio
命令有一个直通(复制)模式,在给定文件名列表(每行一个,在其标准输入上)的情况下,该模式完全符合您的要求。
某些版本的 tar
命令有一个选项可以从标准输入中读取文件名列表,每行一个;在 MacOS X 上,该选项是 -T -
(其中单独的 -
表示“标准输入”)。对于第一个 tar
命令,选项 -f -
表示(在使用 -c
写入存档的上下文中,写入标准输出) ;在第二个 tar
命令中,-x
选项表示 -f -
表示“从标准输入读取”。
可能还有其他选择;仔细查看 tar
的手册页或帮助输出。
此过程复制文件而不是移动它们。操作的后半部分是:
find . -name '*.mov' -exec rm -f {} +
关于bash - 递归移动某种类型的文件并保持其目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798153/