【问题标题】:How to create a duplicate of subdirectories using find如何使用 find 创建子目录的副本
【发布时间】:2016-11-02 13:48:27
【问题描述】:

我在/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=(`<your find statment>`)。然后使用for dir in $DIRS 制作每个目录。
  • 如果目录名中有空格,会起作用吗?
  • 哦,也许不是。我不是 bash 专家,只是在这里吐口水。

标签: linux bash shell sh


【解决方案1】:

试试这个:

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 节,特殊参数) .不得从标准输入中读取任何命令。

【讨论】:

  • 太棒了!就是这个! :)
  • 感谢您的详细回答,尤其是各种引号和括号的正确位置;)那些总是让我生气。在敲了我几个小时的头之后,你在几分钟内向我展示了解决方案。再次感谢!
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2019-12-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多