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

时间:2016-11-02 13:48:27

标签: linux bash shell sh

我在/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,其名称与{{1}内的两个级别的名称完全相同}}?这是我正在寻找的最终结果:

/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

我失去了理智,请帮忙。 :)

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

1 个答案:

答案 0 :(得分: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的手册页):

  

-c从command_string操作数读取命令。在command_name操作数的值和位置参数($1$2等)中设置特殊参数0的值(参见第2.5.2节,特殊参数)来自剩余参数操作数的序列。不应从标准输入读取任何命令。