Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I have the following type of folder structure containing thousands of folders.

The folder names are as such with different names etc

.test
.test.subfolder
.test.subfolder.subsubfolder

.folder
.folder.one
.folder.two
.folder.one.one

What I need to achieve is the following: I want the folders to be renamed e.g. from .test to test, and then move .test.subfolder so that the folder .subfolder is within the folder test without the ., and then .test.subfolder.subsubfolder so that subfolder is within the folder test and subsubfolder is within test/subfolder.

This needs to be recursive since there are many folders. Keep in mind that the files within the folders should still need to be intact.

Is this at all possible?

share|improve this question

3 Answers 3

up vote 2 down vote accepted

This bash script does what you need:

#!/bin/bash
for dir in .*/ ; do
    [[ $dir == ./ || $dir == ../ ]] && continue  # Skip the special dirs
    new=${dir#.}                                 # Remove the dot at the beginning
    new=./${new//.//}                            # Replace dots with slashes, prepend ./
    new=${new%/}                                 # Remove the trainling slash
    mkdir -p ${new%/*}                           # Create the parent dir
    mv "$dir" "$new"                             # Move the dir to destination
done
share|improve this answer

This is pretty easy in zsh, thanks to zmv. Since the wildcard .* expands file names in lexicographic order, a to-be-parent directory will always be renamed before its children, so e.g. test will already exist by the time .test.subfolder is renamed.

zmv '.(*)' "${1//./\/}"
share|improve this answer

Yes it is quite possible. What you need to do is that you need to read all the file names in your path and account for spaces,dots e.t.c. If you want to do that efficiently, you can use this thread : How do I perform an action on all files with a specific extension in subfolders in an elegant way?

Now once you have read the files in the path name you have to lay down a rule.

For example let us consider this structure :

 .test
  .test.subfolder
   .test.subfolder.subsubfolder

What you have got to do is that you have to count the occurrence of the word sub in each of the file names. So if the count is : 0 , it is the parent folder, if count : 1, it is a 1st level child, if count : 3--> it's a 2nd level child and so on and so forth(level is deduced form the structure provided by you)

Hence a possible pseudo code will look like :

  if(filename contains(".test"))
  {
   searchCount("sub");
   if(count ==0)
   parent();
   else if(count ==1)
   1stLevelChild();//and so on
  }

Now according to the result that you are getting here, you just have to use the move command to move the files in appropriate folders.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.