peixe
peixe

Reputation: 1292

Shell script to create directories

I'm trying to create a simple shell script for recursively creating directories inside a list of directories.

I have the next file structure: A directory called v_79, containing a list of "dirs" (from dir_0 to dir_210), and inside each of them there are several directories called ENSG00000??????, where '?' stands for a character between [0-9].

I would like to create a directory called "my_dir" inside every one of the ENSG00000????? dirs.

I know how to create a directory once being inside each of the dir_XX 's,

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

but I don't know how to create the directory that I need, in the v_79 directory.

Upvotes: 0

Views: 4054

Answers (7)

clt60
clt60

Reputation: 63974

this is for dry run - if satisfied, delete the echo before mkdir

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

you need for this bash4 and "shopt -s globstar" (e.g. in your profile)

If you have too much directories, you may get "argument list too long" error (for the 1st echo). In this case the the solution with the find is better

find v_79 -type d -print | grep '/ENSG' | xargs -I% echo mkdir %/my_dir
  • find all directories in v_79
  • filter out only these with name ENSG (you can add more "filters")
  • run (echo) mkdir for the result

is somewhere in the path can be space, modify the above with:

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

Also, you can limit the depth of the find command, e.g.:

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

again, all above is for the dry run - remove the echo for the run. ;)

Upvotes: 1

sorpigal
sorpigal

Reputation: 26106

You want

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

Upvotes: 0

KSDaemon
KSDaemon

Reputation: 366

You can do so from your v_79 directory:

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

Upvotes: 1

glenn jackman
glenn jackman

Reputation: 247210

if your current directory contains directory "v_79", then

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

I wonder if that might give you an "argument list too long" error, in which case find is the way to go.

Upvotes: 2

小武哥
小武哥

Reputation: 446

Just add the -p option, then your work will done.

BTW: -p option for mkdir command means "no error if existing, make parent directories as needed"

Upvotes: 0

mouviciel
mouviciel

Reputation: 67879

If current dir is v_79, you can use a combination of find and xargs:

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

Upvotes: 3

ayckoster
ayckoster

Reputation: 6857

mkdir -p v_79/dir{0,1}{1,2,3}

will create the directories v79/dir01, v79/dir02, v79/dir03, v79/dir11, v79/dir12 and v79/dir13 even if v_79 does not exist.

The -p options will create all required directories recursively.

Upvotes: 2

Related Questions