Bash recursive scripting


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash recursive scripting
# 8  
Old 12-17-2007
Answering a lost question....

You don't need to use recursion, this will enumerate through directories and call a script.

Code:
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               run-some-script.sh
           fi
     )
done

# 9  
Old 11-01-2008
seddirnames: recursive bash directory renaming

I wrote this to fix windows directories (that come inside zip files people send me)
that have spaces in directory names. Renaming files is easier.
With directories you have to go to the bottom of the tree, and then
rename going upwards, on the way out. I couldn't find a script that worked
(I found this old request instead, and several others) so I wrote this
yesterday. It seems to work just fine.

Code:
#!/bin/bash

start=$1
from=$2
to=$3

fix_from_bottom_up()
{
     for file in $1/* 
         do
         if [ -d "$file" ]; then
            fix_from_bottom_up "$file" 
                 fi
     done
     if [ -d "$1" ]; then
                base=`basename $1`
                dir=`dirname $1`
                fixedbase=`echo $base | sed "s/${from}/${to}/g"`
                if [ "$base" != "$fixedbase" ];then
                  mv $1 $dir/$fixedbase
                fi
            fi
}

if [ -z "$1" ]; then
    echo "use:  seddirnames startdir from to"
    exit;
fi

fix_from_bottom_up "$start"


Last edited by bakunin; 11-03-2008 at 07:26 AM.. Reason: Adding "code"-tags around code is a favourite pastime of mine
# 10  
Old 01-30-2009
MySQL

Quote:
Originally Posted by porter
Answering a lost question....

You don't need to use recursion, this will enumerate through directories and call a script.

Code:
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               run-some-script.sh
           fi
     )
done


Kudos, porter!! Thanks for sharing this sample code. It's very well written!

For those of you learning shell scripting, there's some good lessons in this short piece of code, so read on and I'll point out what I really like about porter's sample code:

1) Having the find command do the work, saving the trouble of writing and debugging a recursive function. Always use the tools already included in the shell and/or the UNIX/Linux command set before re-inventing the wheel!

2) Use of the read command non-interactively with the find command; very useful!

3) Use of parenthese to block all the code inside the do...done loop; this sure eliminates mucking about with semi-colons at the end of each line (and having some lines "break" because of unnecessary semi-colons).

4) Error handling: Good example of testing the exit code / return status of a command. e.g. if $test "$?" = "0" # if the exit code ($?) is True (0 zero), then the command succeeded.

------------
NOTES: The use of the double quotes around the variable $N makes the test code above necessary, should the directory (file) name contain one or more blank spaces. With the variable N in single quotes, the cd command would work regardless of blank spaces in the file name. Read about Quoting to find out more.

If a directory name contained non-printable charactes (symbols, device codes, etc.), and the read command never passed them into the variable N, then the cd command would fail.

Directory permissions might cause cd to fail; another reason to handle expected and unexpected errors!

Kudos, porter!
# 11  
Old 01-30-2009
Won't always work

The code below (as written anyway) won't always work,
I don't believe. Not if the purpose of run-some-script.sh
is to rename directories on the fly. Find (it must, I think)
make a list of names to iterate over. So, if you change a directory
name, then all the subdirectories below that one suddenly have
invalid names, and the script will blow up. There might be a way
to use find -depth......but at least as written, I don't think the code
below would work for directory renaming.....


find . -type d | while read N
do
(
cd "$N"
if test "$?" = "0"
then
run-some-script.sh
fi
)
done
# 12  
Old 02-02-2009
Error

Quote:
Originally Posted by salmobytes
The code below (as written anyway) won't always work,
I don't believe. Not if the purpose of run-some-script.sh
is to rename directories on the fly. Find (it must, I think)
make a list of names to iterate over. So, if you change a directory
name, then all the subdirectories below that one suddenly have
invalid names, and the script will blow up. There might be a way
to use find -depth......but at least as written, I don't think the code
below would work for directory renaming.....


find . -type d | while read N
do
(
cd "$N"
if test "$?" = "0"
then
run-some-script.sh
fi
)
done
---------------------

You raise a good question.

Have you had a chance to test it?

.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Homework & Coursework Questions

Bash Scripting

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: Try running 'phone4 xyz' and see what happens. Modify your program so that if no matching name is found, an... (1 Reply)
Discussion started by: OmgHaxor
1 Replies

2. Shell Programming and Scripting

Recursive File Renaming & Natural Sorting (Bash)

NB! I have already started a thread on this subject on ComputerHope (with the thread title "Recursive File Renaming & Logical Sorting"). However, on ComputerHope they are perhaps more specialized in Windows Command Prompt, and not that much in shell scripts for Bash (I guess). I have a bulk... (1 Reply)
Discussion started by: JewzeyfGhewbelz
1 Replies

3. Shell Programming and Scripting

bash scripting

same script: 1- i am using grep to find a string called: tinker panic 0 in a file /etc/ntp.conf if the string is not there, i want to add the strings in /etc/ntp.conf file in the first line of the file. if not do nothing or exit. 2- also i want to add # in front of the following lines in... (0 Replies)
Discussion started by: lamoul
0 Replies

4. Shell Programming and Scripting

bash scripting help

Hi Guys i have a <script?> that spits out the location of each printer using snpget here is the code for i in `sed -n '/Start Printer/,/End Printer/p' /hosts/blah/etc/dhcp/hosts.conf | awk '!/^#/ {print $2}' | egrep -v \... (2 Replies)
Discussion started by: ab52
2 Replies

5. Shell Programming and Scripting

bash scripting help

have this code but when i run it i get this error ./pulse: line 2: and here is the code #!/bin/bash if ; then pulseaudio -k; fi what am i doing wrong thanks Adam (5 Replies)
Discussion started by: ab52
5 Replies

6. Homework & Coursework Questions

bash,scripting

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: i have to do this but i am confused, Create a file containing the bash functions which perform the... (1 Reply)
Discussion started by: CRAZYLITTLELOU
1 Replies

7. Shell Programming and Scripting

bash scripting help

hi all i'm trying to get a script working upon connection with pppd According to docu this happens ina clean environment with a couple of variables set, namely $1,$2,... To be able to execute the statements i included a path statement but i think i'm running into trouble with the variables -... (6 Replies)
Discussion started by: jimjones
6 Replies

8. UNIX for Dummies Questions & Answers

Should I do a bash scripting course?!

Hello, I'm confused (oh, yes). I'm running Linux at work. When I type 'echo $SHELL' I am told that I'm running tcsh. In /bin I note that both tcsh and bash are listed. Question 1: Can I swap to run bash rather than tcsh and, if so, how will this affect my system? Is there any advantage to... (6 Replies)
Discussion started by: macpete
6 Replies

9. Shell Programming and Scripting

Bash Scripting

Hello there peeps: There is a little piece of bash shell scripting problem i have, which i was hoping you could help me with. #!/bin/bash stored_word() { case $(( $$ % 8 )) in 0 ) echo "energy";; 1 ) echo "touch";; 2 ) echo "climbing";; 3 ) echo... (3 Replies)
Discussion started by: keyvan
3 Replies
Login or Register to Ask a Question