1

I have many directory with different name, each of them contain a subdirectory named httpd-ack (same name for all of them) in which are stored files.

I need a command to recursively enter each directory, enter subdir httpd-ack, move all files one level up and then delete the httpd-ack folder (which is empty now).

start is

name1/httpd-ack/(files)

name2/httpd-ack/(files)

name3/...[...]

ending should be

name1/(files)

name2/(files)

name3....[...]

Any help will be much appreciated....

2 Answers2

2

Thanks to @Jos, this worked for me:

  1. Create a file named movefiles.sh (and set it executable) with the following code:

    #!/bin/bash
    path=$1
    echo "Now processing $path" 
    cd "$path" 
    if [ -d "./httpd-ack" ]; then 
     cd httpd-ack 
            mv * ../ 
            cd .. 
            rmdir httpd-ack 
        fi
    
  2. Invoke find as follows:

    find . -maxdepth 1 -type d -exec ./movefiles.sh {} \;
    

It worked like a charm... (I didn't try @bac0n solution.)

Eliah Kagan
  • 119,640
0

This script should be a good start:

#!/bin/bash

moveFiles () {
    path=$1
    echo "Now processing $path"
    cd "$path"
    if [ -d "./httpd-ack" ]; then
        cd httpd-ack
        mv * ../
        cd ..
        rmdir httpd-ack
    fi
}

find top/level/dir -type d -exec moveFiles {} \;

First, it defines a function moveFiles that moves into the httpd-ack directory (if one is present) and moves all files upwards, then cds up and deletes the now empty httpd-ack.

Then it finds all directories, starting from /top/level/dir, and calls the newly defined function on each of them.

I'm sure this could be improved. Editors, feel free.

Jos
  • 30,529
  • 8
  • 89
  • 96