如何使用find命令创建子目录的副本

3

我在 /home/ziga/Mounted/ 目录下有两个子目录,每个子目录中还有多个非空的子目录:

/home/ziga/Mounted/dir1/subdir1-1
/home/ziga/Mounted/dir1/subdir1-2
...

/home/ziga/Mounted/dir2/subdir2-1
/home/ziga/Mounted/dir2/subdir2-2
...

有没有办法使用find在例如/home/ziga/CombinedMounts中创建与/home/ziga/Mounted/两层深度内的目录名称完全相同的目录?这是我想要的最终结果:
/home/ziga/CombinedMounts/subdir1-1
/home/ziga/CombinedMounts/subdir1-2
/home/ziga/CombinedMounts/subdir2-1
/home/ziga/CombinedMounts/subdir2-2
...

我可以使用这个命令获取目录列表:

find /home/ziga/Mounted/ -maxdepth 2 -mindepth 2 -type d ! -name "lost+found" ! -name ".Trash*" -exec basename {} \;

但是我真的想不出如何在mkdir -p 中使用其输出,以便我可以获得所需的子目录。

不知何故,它们总是在/ home / ziga / CombinedMounts / home / ziga / Mounted / ... 中结束。

我快要疯了,请帮帮我。 :)

注意:一些目录名包含空格!


你能把结果设置为数组的元素吗?像这样 DIRS=(\<你的查找语句>`)。然后使用 for dir in $DIRS` 来遍历每个目录。 - Gavin
如果目录名中有空格,那么这个方法还能行得通吗? - zigamilek
哦,也许不是。我不是一个Bash专家,只是在这里胡说八道。 - Gavin
1个回答

2

试试这个:

find /home/ziga/Mounted/ -maxdepth 2 -mindepth 2 \
  -type d ! -name "lost+found" ! -name ".Trash*" \
  -exec sh -c 'mkdir -p /home/ziga/CombinedMounts/"$(basename "$0")"' "{}" \;

我将解释问题中未提及的部分。

我们调用了sh,因为我们无法可靠地将{}占位符传递给像mkdir -p "/path/$(basename "{}")"这样的表达式。该表达式也看起来不明确。

-c选项将参数0的值设置为命令字符串后的操作数的值(请参阅sh的手册页):

-ccommand_string操作数读取命令。从command_name操作数和剩余的参数操作数的顺序中依次设置特殊参数0的值(请参见第2.5.2节“特殊参数”中的$1$2等)。不应从标准输入读取任何命令。


太棒了!就是这样! :) - zigamilek
感谢您详细的回答,特别是正确的引号和括号位置;它们总是让我疯狂。在我苦思冥想了几个小时之后,您在几分钟内向我提供了解决方案。再次感谢! - zigamilek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接