zoheb Posted October 17, 2012 Share Posted October 17, 2012 A. Write a command sequence, to create a directory structure like follows: 1. level 1 - 4 directories with random alphanumeric name of 8 characters each directory 2. level 2 - each level 1 directory will have 3 directories - yes, no and yesorno 3. level 3 - each level 3 directory will have 9 directories with directory named in series 1-9 e.g. [1, 2, 3...9] 4. level 4 - each level 4 directory will have 3 directories - yes, no and yesorno 5. all directories at each level will have a text file named abc.txt with random alpha numeric text of 200 characters Can someone shed a light in a right direction that will help me to achieve this? Thanks !! Link to comment Share on other sites More sharing options...
AstareGod Posted October 17, 2012 Share Posted October 17, 2012 I have a background in C#/VB.NET, so that will influence my answer: You'll need a few nested For-Next loops to create the exact number of directories you need. You'll also need a pseudo-random number generator to generate the random alphanumeric characters, and to make the "yes, no, or yesorno" directories. The 1-9 directories are easy. If you're using .NET, use a TextWriter to write the text files. Have fun! Link to comment Share on other sites More sharing options...
simplezz Posted October 17, 2012 Share Posted October 17, 2012 It could be done in pretty much any language, scripting or otherwise, but assuming you want it in bash: #!/bin/bash function random_chars () { tmp=$( < /dev/urandom tr -dc A-Za-z1-9 | head -c $1 ) eval $2=$tmp } function create_abc () { local rand='' local file=$1'/abc.txt' random_chars 200 rand echo $rand > $file echo $file } function create_1to9 () { for i in 1 2 3 4 5 6 7 8 9 do wd=$1'/'$i mkdir $wd echo $wd create_abc $wd create_yesno $wd 0 done } function create_answer () { local answer=$1'/'$2 mkdir $answer echo $answer create_abc $answer if [ $3 == 1 ] then create_1to9 $answer fi } function create_yesno () { create_answer $1 'yes' $2 create_answer $1 'no' $2 create_answer $1 'yesorno' $2 } function create_dirs () { local ret='' for i in 1 2 3 4 do random_chars 8 ret dir=$1'/'$ret mkdir $dir echo $dir create_abc $dir create_yesno $dir 1 done } function main () { create_dirs $1 } main $1 Copy/echo it into a file, chmod +x it. Then to run: ./script targetdir targetdir is where you want it to create the directory structure. I just used '.' ( current directory ) for testing. My bash script knowledge is pretty awful, so I'm sure someone else could do better. Karl L. 1 Share Link to comment Share on other sites More sharing options...
Kami- Posted October 17, 2012 Share Posted October 17, 2012 I have a background in C#/VB.NET, so that will influence my answer: You'll need a few nested For-Next loops to create the exact number of directories you need. You'll also need a pseudo-random number generator to generate the random alphanumeric characters, and to make the "yes, no, or yesorno" directories. The 1-9 directories are easy. If you're using .NET, use a TextWriter to write the text files. Have fun! That's about as efficient as using ice cream for a fire guard ;) Link to comment Share on other sites More sharing options...
simplezz Posted October 17, 2012 Share Posted October 17, 2012 There was a slight bug in random_chars () that caused it to output the abc.txt file incorrectly. Change it to: Edit: Actually, the tmp variable is superfluous. Just remove it entirely. function random_chars () { eval $2=$( < /dev/urandom tr -dc A-Za-z1-9 | head -c $1 ) } Link to comment Share on other sites More sharing options...
zoheb Posted October 23, 2012 Author Share Posted October 23, 2012 Thanks for your responses.. . . I came up with following command sequence ::::::::::::: bash$ for i in $(seq 4); do mkdir `< /dev/urandom tr -dc A-Z0-9 | head -c8`; donebash$ for i in `ls`; do `mkdir -p $i/{yes,no,yesorno}/{1..9} `; donebash$ find . -type d -exec touch {}/abc.txt \;[/CODE] Now I am stuck at creating "yes,no,yesorno" directory in directories with name 1 - 9 This is what I tried :: bash$ for i in $(find . -type d -name [1-9]); do `mkdir -p /{yes,no,yesorno}`;done but its prompting with error "permission denied" What am I missing? Link to comment Share on other sites More sharing options...
Haggis Veteran Posted October 23, 2012 Veteran Share Posted October 23, 2012 change the permission of the folder Link to comment Share on other sites More sharing options...
Clearskies Posted October 23, 2012 Share Posted October 23, 2012 Thanks for your responses.. . . I came up with following command sequence ::::::::::::: bash$ for i in $(seq 4); do mkdir `< /dev/urandom tr -dc A-Z0-9 | head -c8`; donebash$ for i in `ls`; do `mkdir -p $i/{yes,no,yesorno}/{1..9} `; donebash$ find . -type d -exec touch {}/abc.txt \;[/CODE] Now I am stuck at creating "yes,no,yesorno" directory in directories with name 1 - 9 This is what I tried :: bash$ for i in $(find . -type d -name [1-9]); do `mkdir -p /{yes,no,yesorno}`;done but its prompting with error "permission denied" What am I missing? What's happening is you are trying to create the folders /yes, /no, and /yesorno, which are in the [i]root directory[/i] of your filesystem. What you want is to modify that line to be [CODE]for i in $(find . -type d -name [1-9]); do `mkdir -p $i/{yes,no,yesorno}`; done[/CODE] Basically, you're missing that $i which would make the {yes,no,yesorno} a subdirectory of your random folders as opposed to a subdirectory of the root directory. Nothing Here and zoheb 2 Share Link to comment Share on other sites More sharing options...
zoheb Posted October 28, 2012 Author Share Posted October 28, 2012 What's happening is you are trying to create the folders /yes, /no, and /yesorno, which are in the root directory of your filesystem. What you want is to modify that line to be for i in $(find . -type d -name [1-9]); do `mkdir -p $i/{yes,no,yesorno}`; done[/CODE] Basically, you're missing that $i which would make the {yes,no,yesorno} a subdirectory of your random folders as opposed to a subdirectory of the root directory. Thats what I needed. .. . .Thanks.. . But now there are some other complications I am facing,,, :( I need to redirect the output to [b]output.txt[/b] and error to [b]error.txt[/b] [b]I came up with this:[/b] [CODE]for i in $(seq 4); do mkdir `< /dev/urandom tr -dc A-Z0-9 | head -c8`<&- 2>$HOME/error.txt; donefor i in `ls` ; do `mkdir -p $i/{yes,no,yesorno}/{1..9}` <&- 1>$HOME/output.txt 2>>$HOME/error.txt; donefor i in $(find . -type d -name [1-9]); do `mkdir -p $i/{yes,no,yesorno} <&- 1>$HOME/output.txt 2>>$HOME/error.txt `;donefor i in $(find . -type d); do `< /dev/urandom tr -dc A-Z0-9 | head -c200 > $i/abc.txt <&- 2>>$HOME/error.txt `; done [/CODE] After that, I need to join all the command sequences into one single command. When I tried joining the commands and placing [b]done [/b]at the end, it seems to be something is missing.. please help Link to comment Share on other sites More sharing options...
Karl L. Posted October 28, 2012 Share Posted October 28, 2012 'done' indicates the end of a loop, not the end of a command sequence. 'joining' the command should be as simple as placing them all on one line with semicolons between them. Based on the four commands you quoted in your last post, your final command should look something like this: for i in $(seq 4); do mkdir `< /dev/urandom tr -dc A-Z0-9 | head -c8`<&- 2>$HOME/error.txt; done; for i in `ls` ; do `mkdir -p $i/{yes,no,yesorno}/{1..9}` <&- 1>$HOME/output.txt 2>>$HOME/error.txt; done; for i in $(find . -type d -name [1-9]); do `mkdir -p $i/{yes,no,yesorno} <&- 1>$HOME/output.txt 2>>$HOME/error.txt `;done; for i in $(find . -type d); do `< /dev/urandom tr -dc A-Z0-9 | head -c200 > $i/abc.txt <&- 2>>$HOME/error.txt `; done[/CODE] zoheb and Nothing Here 2 Share Link to comment Share on other sites More sharing options...
zoheb Posted October 29, 2012 Author Share Posted October 29, 2012 'done' indicates the end of a loop, not the end of a command sequence. 'joining' the command should be as simple as placing them all on one line with semicolons between them. Based on the four commands you quoted in your last post, your final command should look something like this: for i in $(seq 4); do mkdir `< /dev/urandom tr -dc A-Z0-9 | head -c8`<&- 2>$HOME/error.txt; done; for i in `ls` ; do `mkdir -p $i/{yes,no,yesorno}/{1..9}` <&- 1>$HOME/output.txt 2>>$HOME/error.txt; done; for i in $(find . -type d -name [1-9]); do `mkdir -p $i/{yes,no,yesorno} <&- 1>$HOME/output.txt 2>>$HOME/error.txt `;done; for i in $(find . -type d); do `< /dev/urandom tr -dc A-Z0-9 | head -c200 > $i/abc.txt <&- 2>>$HOME/error.txt `; done[/CODE] Thank you. . .. Finally. .. :) [CODE]for i in $(seq 4); do mkdir `< /dev/urandom tr -dc A-Z0-9 | head -c8`<&- 2>$HOME/error.txt; done;for i in `ls`; do `mkdir -p $i/{yes,no,yesorno}/{1..9}` <&- 1>$HOME/output.txt 2>>$HOME/error.txt; done;for i in $(find . -type d -name [1-9]); do `mkdir -p $i/{yes,no,yesorno}` <&- 1>$HOME/output.txt 2>>$HOME/error.txt; done;for i in $(find . -type d); do `< /dev/urandom tr -dc A-Z0-9 | head -c200 > $i/abc.txt` <&- 2>>$HOME/error.txt; done[/CODE] Link to comment Share on other sites More sharing options...
zoheb Posted October 29, 2012 Author Share Posted October 29, 2012 I tried to edit the above post but can't see the edit button, ,, :( btw, can we redirect the output of mkdir command to a file? i.e output.txt . . .coz its always empty. And when I execute the command twice, I get an error "Unable to create a directory abc.txt" How can I make this command to be executed "n" number of times?. . .I don't want to loop it . .. I need to execute the same command on the previous output it generated. Now I can see the edit button. . Link to comment Share on other sites More sharing options...
Karl L. Posted October 29, 2012 Share Posted October 29, 2012 I think your problem is that mkdir doesn't actually output anything to screen unless it encounters an error; so redirecting its output to a file is virtually useless. If you really want it to print a message, try passing it the -v switch. As for the second part of your question about executing the command 'n' times, I have no idea what you are talking about. My best guess is that you want to create a directory inside of a directory that does not yet exist. To create any intermediate directories you could pass mkdir the -p switch. Putting all of the above together your command may look something like the following: mkdir -pv 'rar' 1>output.txt 2>&1[/CODE] Link to comment Share on other sites More sharing options...
Recommended Posts