【问题标题】:Shell script to create directories用于创建目录的 Shell 脚本
【发布时间】:2011-06-23 11:56:05
【问题描述】:

我正在尝试创建一个简单的 shell 脚本,用于在目录列表中递归地创建目录。

我有下一个文件结构: 一个名为 v_79 的目录,包含一个“目录”列表(从 dir_0 到 dir_210),在每个目录中都有几个名为 ENSG00000?????? 的目录,其中 '?'代表 [0-9] 之间的字符。

我想在每一个ENSG00000里面创建一个名为“my_dir”的目录??????目录。

我知道如何在每个 dir_XX 中创建一个目录,

    for i in ENSG00000??????; do mkdir $i/my_dir; done

但我不知道如何创建我需要的目录,在 v_79 目录中。

【问题讨论】:

  • 这只需要一个外部循环来遍历 dir_0 到 dir_210 结构
  • 要创建的目录数量之多令人难以置信 - 4.22 亿? dir_0 到 dir_210 = 211 x ENSG00000000000 到 ENSG00000999999 = 1,000,000 + 每个目录的 my_dir 的另一个百万,因此每个 dir_n 200 万 = 4.22 亿。除非您解释了错误,否则您将很难将其应用于任何文件系统。还是ENSG00000??????已经存在?
  • “我知道如何在里面创建目录......” - 不,我不认为你这样做 :-) 那只会尝试创建已经存在的目录。
  • @Orbling:不是每个目录都必须有 1.000.000 个目录; (从 0 到 999.999)。事实上,它不超过 100 个名为 ENSG 的目录??????这些数字仅用于命名目的。对不起!

标签: bash shell directory


【解决方案1】:

如果当前目录是 v_79,您可以使用 findxargs 的组合:

find . -name 'ENSG00000......' -type d | xargs -I DIR mkdir DIR/my_dir 

【讨论】:

    【解决方案2】:

    如果你的当前目录包含目录“v_79”,那么

    for dir in v_79/dir_{0..210}/ENSG00000??????; do mkdir $dir/my_dir; done
    

    我想知道这是否会给你一个“参数列表太长”的错误,在这种情况下find 是要走的路。

    【讨论】:

    • 完美,格伦。这完成了这项工作。非常感谢!
    【解决方案3】:
    mkdir -p v_79/dir{0,1}{1,2,3}
    

    即使 v_79 不存在,也会创建目录 v79/dir01、v79/dir02、v79/dir03、v79/dir11、v79/dir12 和 v79/dir13。

    -p 选项将递归创建所有需要的目录。

    【讨论】:

    • 目录dir_xx已经存在;我不需要创建它们,正如@mouviciel 所说,它不会在其中创建 my_dir 目录。无论如何谢谢!
    【解决方案4】:

    您可以从您的 v_79 目录执行此操作:

    for i in `find . -type d -name "ENSG00000??????"`; do mkdir $i/my_dir; done
    

    【讨论】:

    • 这将在当前目录中名为 find-typed-nameENSG00000?????? 的目录中创建名为 my_dir 的目录,但前提是这些目录已经存在。你的意思是说for i in $(find . -type d -name "ENSG00000??????") ; do mkdir -i $i/my_dir ; done,但这也只会在父目录已经存在的情况下创建子目录。
    【解决方案5】:

    这是给dry run - 如果满意,删除mkdir之前的回声

    echo ./v_79/**/ENSG* | xargs -I% echo mkdir %/my_dir #or
    echo ./v_79/**/dir_*/ENSG* | xargs -I% echo mkdir %/my_dir
    

    你需要这个 bash4 和“shopt -s globstar”(例如在你的个人资料中)

    如果您的目录过多,您可能会收到“参数列表太长”错误(对于第一个回显)。在这种情况下,find 的解决方案更好

    find v_79 -type d -print | grep '/ENSG' | xargs -I% echo mkdir %/my_dir
    
    • 查找 v_79 中的所有目录
    • 仅过滤掉名称为 ENSG 的这些(您可以添加更多“过滤器”)
    • 运行 (echo) mkdir 以获得结果

    是路径中某处可以是空格,上面修改为:

    find v_79 -type d -print0 | grep -z '/ENSG' | xargs -0 -I% echo mkdir %/my_dir
    

    另外,您可以限制查找命令的深度,例如:

    find v_79 -depth 2 -type d -print0 | grep -z '/ENSG' | xargs -0 -I% echo mkdir %/my_dir
    

    再次,以上所有内容都是针对试运行的 - 删除运行的回声。 ;)

    【讨论】:

    • 我已经用第一个答案中的解决方案做到了。 :) 无论如何,我会投票赞成你的解决方案,因为我是一个新手,它总是有趣的解决方案与你所做的解释的代码......;)
    【解决方案6】:

    只需添加 -p 选项,您的工作就完成了。

    顺便说一句:mkdir 命令的 -p 选项表示“如果存在则没有错误,根据需要创建父目录”

    【讨论】:

      【解决方案7】:

      你想要

      mkdir v_79/dir_{0,1,2}{,0,1,2,3,4,5,6,7,8,9}{,0,1,2,3,4,5,6,7,8,9}/ENSG00000??????/my_dir
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        • 2019-01-20
        • 2017-12-03
        • 2014-02-01
        • 2014-06-16
        • 2014-05-19
        • 1970-01-01
        相关资源
        最近更新 更多