How to get full path of a file?
LinuxFileUnixPathLinux Problem Overview
Is there an easy way I can print the full path of file.txt
?
file.txt = /nfs/an/disks/jj/home/dir/file.txt
The <command>
dir> <command> file.txt
should print
/nfs/an/disks/jj/home/dir/file.txt
Linux Solutions
Solution 1 - Linux
Use readlink:
readlink -f file.txt
Solution 2 - Linux
I suppose you are using Linux.
I found a utility called realpath
in coreutils 8.15.
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
As per @styrofoam-fly and @arch-standton comments, realpath
alone doesn't check for file existence, to solve this add the e
argument: realpath -e file
Solution 3 - Linux
The following usually does the trick:
echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")"
Solution 4 - Linux
I know there's an easier way that this, but darned if I can find it...
jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav
jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
Solution 5 - Linux
On Windows:
- Holding
Shift
and right clicking on a file in Windows Explorer gives you an option calledCopy as Path
. This will copy the full path of the file to clipboard.
On Linux:
- You can use the command
realpath yourfile
to get the full path of a file as suggested by others.
Solution 6 - Linux
find $PWD -type f | grep "filename"
or
find $PWD -type f -name "*filename*"
Solution 7 - Linux
If you are in the same directory as the file:
ls "`pwd`/file.txt"
Replace file.txt
with your target filename.
Solution 8 - Linux
You could use the fpn (full path name) script:
% pwd
/Users/adamatan/bins/scripts/fpn
% ls
LICENSE README.md fpn.py
% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py
fpn
is not a standard Linux package, but it's a free and open github project and you could set it up in a minute.
Solution 9 - Linux
I know that this is an old question now, but just to add to the information here:
The Linux command which
can be used to find the filepath of a command file, i.e.
$ which ls
/bin/ls
There are some caveats to this; please see https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/.
Solution 10 - Linux
*Works on Mac, Linux, nix:
This will give you a quoted csv of all files in the current dir:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
The output of this can be easily copied into a python list or any similar data structure.
Solution 11 - Linux
You can save this in your shell.rc
or just put in console
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
example:
ap somefile.txt
will output
/home/user/somefile.txt
Solution 12 - Linux
You may use this function. If the file name is given without relative path, then it is assumed to be present in the current working directory:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
Usage:
$ abspath file.txt
/I/am/in/present/dir/file.txt
Usage with relative path:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
With spaces in file name:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
Solution 13 - Linux
In a similar scenario, I'm launching a cshell script from some other location. For setting the correct absolute path of the script so that it runs in the designated directory only, I'm using the following code:
set script_dir = `pwd`/`dirname $0`
$0
stores the exact string how the script was executed.
For e.g. if the script was launched like this: $> ../../test/test.csh
,
$script_dir
will contain /home/abc/sandbox/v1/../../test
Solution 14 - Linux
For Mac OS X, I replaced the utilities that come with the operating system and replaced them with a newer version of coreutils. This allows you to access tools like readlink -f
(for absolute path to files) and realpath
(absolute path to directories) on your Mac.
The Homebrew version appends a 'G' (for GNU Tools) in front of the command name -- so the equivalents become greadlink -f FILE
and grealpath DIRECTORY
.
Instructions for how to install the coreutils/GNU Tools on Mac OS X through Homebrew can be found in this StackExchange arcticle.
NB: The readlink -f
and realpath
commands should work out of the box for non-Mac Unix users.
Solution 15 - Linux
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
This is explanation of what is going on at @ZeRemz's answer:
- This script get relative path as argument
"$1"
- Then we get dirname part of that path (you can pass either dir or file to this script):
dirname "$1"
- Then we
cd "$(dirname "$1")
into this relative dir && pwd -P
and get absolute path for it.-P
option will avoid all symlinks- After that we append basename to absolute path:
$(basename "$1")
- As final step we
echo
it
Solution 16 - Linux
The shortest way to get the full path of a file on Linux or Mac is to use the ls
command and the PWD
environment variable.
<0.o> touch afile
<0.o> pwd
/adir
<0.o> ls $PWD/afile
/adir/afile
You can do the same thing with a directory variable of your own, say d
.
<0.o> touch afile
<0.o> d=/adir
<0.o> ls $d/afile
/adir/afile
Notice that without flags ls <FILE>
and echo <FILE>
are equivalent (for valid names of files in the current directory), so if you're using echo
for that, you can use ls
instead if you want.
If the situation is reversed, so that you have the full path and want the filename, just use the basename
command.
<0.o> touch afile
<0.o> basename $PWD/afile
afile
Solution 17 - Linux
I was surprised no one mentioned located.
If you have the locate
package installed, you don't even need to be in the directory with the file of interest.
Say I am looking for the full pathname of a setenv.sh
script. This is how to find it.
$ locate setenv.sh
/home/davis/progs/devpost_aws_disaster_response/python/setenv.sh
/home/davis/progs/devpost_aws_disaster_response/webapp/setenv.sh
/home/davis/progs/eb_testy/setenv.sh
Note, it finds three scripts in this case, but if I wanted just one I would do this:
$ locate *testy*setenv.sh
/home/davis/progs/eb_testy/setenv.sh
Solution 18 - Linux
I like many of the answers already given, but I have found this really useful, especially within a script to get the full path of a file, including following symlinks and relative references such as .
and ..
dirname `readlink -e relative/path/to/file`
Which will return the full path of the file
from the root path onwards.
This can be used in a script so that the script knows which path it is running from, which is useful in a repository clone which could be located anywhere on a machine.
basePath=`dirname \`readlink -e $0\``
I can then use the ${basePath}
variable in my scripts to directly reference other scripts.
Hope this helps,
Dave
Solution 19 - Linux
This works with both Linux and Mac OSX:
echo $(pwd)$/$(ls file.txt)
Solution 20 - Linux
This worked pretty well for me. It doesn't rely on the file system (a pro/con depending on need) so it'll be fast; and, it should be portable to most any *NIX. It does assume the passed string is indeed relative to the PWD and not some other directory.
function abspath () {
echo $1 | awk '\
# Root parent directory refs to the PWD for replacement below
/^\.\.\// { sub("^", "./") } \
# Replace the symbolic PWD refs with the absolute PWD \
/^\.\// { sub("^\.", ENVIRON["PWD"])} \
# Print absolute paths \
/^\// {print} \'
}
Solution 21 - Linux
This is naive, but I had to make it to be POSIX compliant. Requires permission to cd into the file's directory.
#!/bin/sh
if [ ${#} = 0 ]; then
echo "Error: 0 args. need 1" >&2
exit 1
fi
if [ -d ${1} ]; then
# Directory
base=$( cd ${1}; echo ${PWD##*/} )
dir=$( cd ${1}; echo ${PWD%${base}} )
if [ ${dir} = / ]; then
parentPath=${dir}
else
parentPath=${dir%/}
fi
if [ -z ${base} ] || [ -z ${parentPath} ]; then
if [ -n ${1} ]; then
fullPath=$( cd ${1}; echo ${PWD} )
else
echo "Error: unsupported scenario 1" >&2
exit 1
fi
fi
elif [ ${1%/*} = ${1} ]; then
if [ -f ./${1} ]; then
# File in current directory
base=$( echo ${1##*/} )
parentPath=$( echo ${PWD} )
else
echo "Error: unsupported scenario 2" >&2
exit 1
fi
elif [ -f ${1} ] && [ -d ${1%/*} ]; then
# File in directory
base=$( echo ${1##*/} )
parentPath=$( cd ${1%/*}; echo ${PWD} )
else
echo "Error: not file or directory" >&2
exit 1
fi
if [ ${parentPath} = / ]; then
fullPath=${fullPath:-${parentPath}${base}}
fi
fullPath=${fullPath:-${parentPath}/${base}}
if [ ! -e ${fullPath} ]; then
echo "Error: does not exist" >&2
exit 1
fi
echo ${fullPath}
Solution 22 - Linux
find / -samefile file.txt -print
Will find all the links to the file with the same inode number as file.txt
adding a -xdev
flag will avoid find
to cross device boundaries ("mount points"). (But this will probably cause nothing to be found if the find
does not start at a directory on the same device as file.txt
)
Do note that find
can report multiple paths for a single filesystem object, because an Inode can be linked by more than one directory entry, possibly even using different names. For instance:
find /bin -samefile /bin/gunzip -ls
Will output:
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/uncompress
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/gunzip
Solution 23 - Linux
Usually:
find `pwd` | grep <filename>
Alternatively, just for the current folder:
find `pwd` -maxdepth 1 | grep <filename>
Solution 24 - Linux
This will work for both file and folder:
getAbsolutePath(){
[[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } ||
{ cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
Solution 25 - Linux
Another Linux utility, that does this job:
fname <file>
Solution 26 - Linux
For Mac OS, if you just want to get the path of a file in the finder, control click the file, and scroll down to "Services" at the bottom. You get many choices, including "copy path" and "copy full path". Clicking on one of these puts the path on the clipboard.
Solution 27 - Linux
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}
Copies the text to your clipboard and displays the text on the terminal window.
:)
(I copied some of the code from another stack overflow answer but cannot find that answer anymore)
Solution 28 - Linux
In Mac OSX, do the following steps:
cd
into the directory of the target file.- Type either of the following terminal commands.
ls " Terminal
pwd
/file.txt"
echo $(pwd)/file.txt
- Replace
file.txt
with your actual file name. - Press Enter
Solution 29 - Linux
This can be simplified
ls <file_name> | pwd
Solution 30 - Linux
Beside "readlink -f" , another commonly used command: > > $find /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile > /the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile > $ >
This also give the full path and file name at console
Off-topic: This method just gives relative links, not absolute. The readlink -f
command is the right one.
Solution 31 - Linux
The easiest way I found is:
for i in `ls`; do echo "`pwd`/$i"; done
It works well for me.
Solution 32 - Linux
Create a function like the below (echoes the absolute path of a file with pwd and adds the file at the end of the path:
abspath() { echo $(pwd "$1")/"$1"; }
Now you can just find any file path:
abspath myfile.ext
Solution 33 - Linux
To get full path of a file :
- open your terminal in the folder containing your file, by pushing on the keyboard following keys:
CTRL + ALT + T
-
then type "pwd" (acronym of Print name of Working Directory):
your@device ~ $ pwd
that's all folks!
Solution 34 - Linux
In mac mentioned below line works. No need to add any fancy lines.
> pwd filename
Solution 35 - Linux
This will give you absolute path of the file:
find / -name file.txt