我正在尝试创建一个简单的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目录中创建我需要的目录。
答案 0 :(得分:3)
如果当前目录为v_79,则可以使用find
和xargs
的组合:
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
是路径中的某个地方可以是空格,修改上面的:
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