用于创建目录的Shell脚本

时间:2011-06-23 11:56:06

标签: bash shell directory

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

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

我想在每个ENSG00000中创建一个名为“my_dir”的目录?????显示目录。

我知道如何在每个dir_XX的内部创建一个目录,

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

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

7 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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选项将以递归方式创建所有必需的目录。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

这是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

再次,以上所有都是干运行 - 删除运行的回声。 ;)

答案 5 :(得分:0)

只需添加-p选项,即可完成工作。

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

答案 6 :(得分:0)

你想要

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