BobMcGee BobMcGee - 3 months ago 7
Bash Question

How do I get the absolute directory of a file in bash?

I have written a bash script that takes an input file as an argument and reads it.

This file contains some paths (relative to its location) to additional files used.

I would like the script to go to the folder containing the input file, to execute further commands.

So, how do I get the folder (and just the folder) from an input file? (In linux.)

Answer

To get the full path use:

readlink -f relative/path/to/file

To get the directory of a file:

dirname relative/path/to/file

You can also combine the two:

dirname $(readlink -f relative/path/to/file)

If readlink -f is not available on your system you can use this:

function myreadlink() {
  (
  cd $(dirname $1)         # or  cd ${1%/*}
  echo $PWD/$(basename $1) # or  echo $PWD/${1##*/}
  )
}

Note that if you only need to move to a directory of a file specified as a relative path, you don't need to know the absolute path, a relative path is perfectly legal, so just use:

cd $(dirname relative/path/to/file)

if you wish to go back (while the script is running) to the original path, use pushd instead of cd, and popd when you are done.