将给定类型的所有文件从目录移动到另一个目录,但保留目录层次结构(请参阅说明)

时间:2013-05-06 19:39:25

标签: bash shell

所以,我想将所有.xml从一个目录(带子目录)移动到一个新目录;但是,如果文件在子目录中,我希望它们保留在子目录中。基本上,我有一堆已经分类的文件,我只想要它们的一部分,但我仍然需要它们保持分离。我编写了这个简单的命令,它将遍历我的cwd及其子目录中的所有.xml文件,但这会将所有内容放入一个目录中:

find . -name "*.xml" -exec mv {} ~/Desktop/test/ \;

我不知道如何通过此命令创建新的子目录/将每个文件发送到其各自的新位置。我知道我可以通过perl或其他语言来做到这一点,但我希望能够通过终端命令来做到这一点(我正在尝试学习如何使用bash玩法)。

提前致谢。

3 个答案:

答案 0 :(得分:6)

使用tar复制具有目录结构的文件:

find . -name "*.xml" -print0 |
tar -cf - --null -T- |
tar -C ~/Desktop/test/ -xf -

或者,您可以将cp--parents选项一起使用:

find . -name "*.xml" -exec cp -a -t ~/Desktop/test/ --parents {} +

答案 1 :(得分:2)

您可以尝试以下内容:

find . -name "*.xml" -exec sh -c 'mkdir -p ~/Desktop/`dirname "{}"`; mv "{}" ~/Desktop/`dirname "{}"`' \;

答案 2 :(得分:1)

对于某些情况,我喜欢cpio命令

any_command_what_produces_relative_path_names | cpio -pamVd /new/parent/dir

例如:

find . -name \*.xml -print0 | cpio -pamvd0 /new/parent/dir

或过滤find

的输出
find . -name \*.xml -print0 |\
  grep -zP 'only_some_of_them' |\
  cpio -pamvd0 /new/parent/dir

或只有那些,包含字符串“blabla”

find . -name \*.xml -print0 |\
  xargs -0 grep -zl "blabla" |\
  cpio -pamvd0 /new/parent/dir