Search code examples
bashbatch-rename

Rename file after (last) directory


I am trying to rename files in my bash to their latest file name. The structure is as follows:

directories..../Test1/abc.txt
directories..../Test2/abc.txt
directories..../Test3/abc.txt

I want to end up with

directories..../Test1/Test1.txt
directories..../Test2/Test2.txt
directories..../Test3/Test3.txt

Right now I am stuck here:

pathname=/mnt/grid/*

for file in /mnt/grid/*/*.txt; do
    mv "$file" "$(dirname "$file")/$(basename ${pathname}.txt)"
done

Solution

  • To find the name of the directory containing a file run basename "$(dirname "$file")". For example:

    $ file=/tmp/foo/bar.txt
    $ basename "$(dirname "$file")"
    foo
    

    This way there's no need for pathname, and the loop body can simply be

    echo "$file" "$(dirname "$file")/$(basename "$(dirname "$file")").txt"
    

    (Replace echo with mv if this looks right.)