create dir in main &subdirs,perform action

Hi,

I have one dir which has N subdirs.For ex:

/home/user/Project_Src
/home/user/Project_Src/Dir_A
/home/user/Project_Src/Dir_A/subdir/sub_dir2
/home/user/Project_Src/Dir_A/subdir/sub_dir3
/home/user/Project_Src/Dir_B
/home/user/Project_Src/Dir_B/Build

i want to create a folder with the name "NEW" in all the dirs & subdirs under /home/user/Project_Src and perform action (rm -rf .svn) in above mentioned directories.(ie under Project_Src all dirs & subdirs) while performing action i want the directory name in which the action is performed ie echo $dirname.

Result should be with the removal of .svn in all dirs,subdirs recursively:
/home/user/Project_Src/NEW
/home/user/Project_Src/Dir_A/NEW
/home/user/Project_Src/Dir_A/subdir/sub_dir2/NEW
/home/user/Project_Src/Dir_A/subdir/sub_dir3/NEW
/home/user/Project_Src/Dir_B/NEW
/home/user/Project_Src/Dir_B/Build/NEW

i tried to use for loop similar to below mentioned thread:

I got folder only under /Project_Src. I am using bash.

Thanks for all your help.

Something like this ?

$ 
$ 
$ # show the entire file hierarchy from the root directory "Project_Src"
$ find ./Project_Src -name "*"
./Project_Src
./Project_Src/x1.svn
./Project_Src/Dir_B
./Project_Src/Dir_B/x1.svn
./Project_Src/Dir_B/Build
./Project_Src/Dir_B/Build/x1.svn
./Project_Src/Dir_B/Build/y1.txt
./Project_Src/Dir_B/y1.txt
./Project_Src/Dir_A
./Project_Src/Dir_A/x1.svn
./Project_Src/Dir_A/y1.txt
./Project_Src/Dir_A/subdir
./Project_Src/Dir_A/subdir/sub_dir2
./Project_Src/Dir_A/subdir/sub_dir2/x1.svn
./Project_Src/Dir_A/subdir/sub_dir2/y1.txt
./Project_Src/Dir_A/subdir/sub_dir3
./Project_Src/Dir_A/subdir/sub_dir3/x1.svn
./Project_Src/Dir_A/subdir/sub_dir3/y1.txt
./Project_Src/Dir_A/subdir/x1.svn
./Project_Src/Dir_A/subdir/y1.txt
./Project_Src/y1.txt
$ 
$ # show the content of the Bash shell script that processes
$ # all directories in "Project_Src" recursively
$ cat -n processdirs.sh
     1    #!/bin/bash
     2    for i in `find ./Project_Src -type d -name "*"` ; do
     3      echo "Now inspecting directory : $i"
     4      echo "Now removing svn files..."
     5      rm $i/*.svn
     6      echo "Now creating directory NEW..."
     7      mkdir -p $i/NEW
     8      echo "=========================================================================="
     9    done
$ 
$ 
$ # now execute the script "processdirs.sh"
$ ./processdirs.sh
Now inspecting directory : ./Project_Src
Now removing svn files...
Now creating directory NEW...
==========================================================================
Now inspecting directory : ./Project_Src/Dir_B
Now removing svn files...
Now creating directory NEW...
==========================================================================
Now inspecting directory : ./Project_Src/Dir_B/Build
Now removing svn files...
Now creating directory NEW...
==========================================================================
Now inspecting directory : ./Project_Src/Dir_A
Now removing svn files...
Now creating directory NEW...
==========================================================================
Now inspecting directory : ./Project_Src/Dir_A/subdir
Now removing svn files...
Now creating directory NEW...
==========================================================================
Now inspecting directory : ./Project_Src/Dir_A/subdir/sub_dir2
Now removing svn files...
Now creating directory NEW...
==========================================================================
Now inspecting directory : ./Project_Src/Dir_A/subdir/sub_dir3
Now removing svn files...
Now creating directory NEW...
==========================================================================
$ 
$ 
$ # check the entire hierarchy tree again, to ensure that the script worked
$ find ./Project_Src -name "*"
./Project_Src
./Project_Src/Dir_B
./Project_Src/Dir_B/Build
./Project_Src/Dir_B/Build/NEW
./Project_Src/Dir_B/Build/y1.txt
./Project_Src/Dir_B/NEW
./Project_Src/Dir_B/y1.txt
./Project_Src/NEW
./Project_Src/Dir_A
./Project_Src/Dir_A/NEW
./Project_Src/Dir_A/y1.txt
./Project_Src/Dir_A/subdir
./Project_Src/Dir_A/subdir/sub_dir2
./Project_Src/Dir_A/subdir/sub_dir2/NEW
./Project_Src/Dir_A/subdir/sub_dir2/y1.txt
./Project_Src/Dir_A/subdir/sub_dir3
./Project_Src/Dir_A/subdir/sub_dir3/NEW
./Project_Src/Dir_A/subdir/sub_dir3/y1.txt
./Project_Src/Dir_A/subdir/NEW
./Project_Src/Dir_A/subdir/y1.txt
./Project_Src/y1.txt
$ 
$ 

tyler_durden

1 Like

I believe .svn are hidden directories used by subversion, not files. If so, rm without -rf won't remove them. Also, if they are directories, since they're going to be nuked, it's best to exclude them from the find traversal to avoid noisy error messages and/or pointless mkdir operations.

Perhaps this will do:

find /home/user/Project_Src -type d ! \( -name .svn -o -name NEW \) -exec sh -c '
    for d; do
        echo "$d"
        mkdir "$d"/NEW
        rm -fr "$d"/.svn
    done' sh {} +

Regards,
Alister

1 Like