1

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

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

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

提前致谢。

4

3 回答 3

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 {} +
于 2013-05-06T19:52:20.527 回答
2

您可以尝试以下方法:

find . -name "*.xml" -exec sh -c 'mkdir -p ~/Desktop/`dirname "{}"`; mv "{}" ~/Desktop/`dirname "{}"`' \;
于 2013-05-06T19:55:23.540 回答
1

在某些情况下,我喜欢这个cpio命令

any_command_what_produces_relative_path_names | cpio -pamVd /new/parent/dir

例如:

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

或过滤查找的输出

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
于 2013-05-06T20:48:24.080 回答