Under Windows, most applications and application data are stored in a special directory known as C:\Program Files
(and occasionally C:\Program Files (x86)
). What is the Ubuntu/Linux equivalent to this path? Is there even one?
-
2If you want to know where are the files of specific package, you can use Synaptic package manager. Just search for package, and see its installed files.– AsmeritoFeb 20, 2011 at 8:17
-
6I think this question would be improved by a reason for wanting an equivalent. There is a difference between, for instance, "lets see what I have installed and what I can run", and "I'm trying to find the save-game of this/that piece of software, so I can fiddle with it" and maybe even "I suspect some setting-file / ini-file for this program that I can tweak". Those could all be "Program Files" question, but have different answers here.– NanneMay 13, 2013 at 9:03
-
4Related (but probably shouldn't be considered a duplicate): How to understand the Ubuntu file system layout?– Eliah KaganJul 21, 2013 at 2:43
10 Answers
Late Answer - I've created a roadmap for beginners to follow. If they are looking for a file but don't know where to look, they can use the map to roughly navigate around. You can download a hi-res PNG here. You can find the related post here.
-
9this answer is ignored it should be at the top.– user677696May 17, 2017 at 13:27
-
1When I see it laid out like this, I realise it's no wonder modern distros try to hide this stuff. What a mess (beautiful mess). And I don't agree with this layout completely - it's brilliant, but for example /etc holds application configs as much as O/S configs, so it feels like it should be to the left of the second-from-right-most yellow "User Specific" question as a "no" branch. For example, apache is an application, it's not O/S essential. Neither is Docker, Folding@Home, VMware, or a host of others that use /etc for configs. Great diagram though.– ScaineMay 5, 2020 at 14:12
[EDIT: You should probably check out d4nyll's answer instead, which is a nifty map, acting as an extensive beginner's guide to the Linux file system]
/bin
and /usr/bin
is where the scripts are that start the programs. The direct equivalent of "Program Files" though is probably /opt
or maybe/usr/share
(see Filesystem Hierarchy Standard). That directory contains the various support files for most programs.
There probably isn't a direct equivalent however, since, for example, library files are shared across the system (in /lib
) and options are either user specified (in the user's home directory) or universally located in /etc
.
So installing a program via a deb file, repository or build will likely place files in all of these locations.
[EDIT] And as others note, there is also /sbin
and /usr/sbin
. Plus /usr/local/bin
, /opt/bin
and even /usr/games/
. So definitely not a direct comparison to c:\program files
!
-
5How about
/opt
? I've seen that hold many (usually closed-source or app-based) programs before in a similar way toProgram Files
.– KupiakosMay 14, 2013 at 0:12 -
Seems to be going that way, with the advent of the Ubuntu Software Centre delivering its games there, certainly. But even then, hardly a direct comparison, really, is it? Might the closest thing these days though.– ScaineMay 14, 2013 at 23:03
-
See askubuntu.com/a/294492/41499 for what the
/opt
directory is for. Jul 5, 2013 at 6:36 -
/usr/local/bin
is a semi-common location for software that might be not commonly used by a user/company. Nov 21, 2018 at 0:44 -
1If you're looking for productivity in the workplace, (1) Everything is terminal. Terminal is much faster than navigating through a hierarchy of options in a program. You usually have to google how to change a setting anyway which involves following a sequence of screenshots, now google gives you a copy-pastable command (2) cron's let you setup anything to run in the background and do whatever you want it to do (3) It's easy to use bash to automate anything you want to be automated Aug 21, 2019 at 3:21
EDIT: See also d4nyll's answer below above for an excellent and beginner-friendly map!
Read my answer below for more info on what the PATH
environment variable is, what .desktop
files are, and how to find a specific program using various linux commands.
Original answer:
There is no easy answer.
/bin
,/usr/bin
, and /usr/share
As mentioned in the other answers, you can find most executables under /bin
or /usr/bin
, and the support files are installed in /usr/share
.
/usr/local
and /opt
There are however more directories in which Ubuntu installs applications. The PATH
variable, which determines where to search for an entered command, might give you a clue, mine looks like (echo $PATH
in a terminal):
/usr/local/cuda/bin:/usr/local/texlive/2012/bin/x86_64-linux:/usr/games:/home/gerhard/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
As you can see some software is installed in /usr/local
and have their own directory and bin
. Another place where many programs are installed is /opt
. The properties of these locations are explained by the Filesystem Hierarchy Standard, which is a very good read. Unfortunately, the difference between /opt
and /usr/local
is not very well explained, someone on the unix stackexchange had a more elaborate explanation:
/usr/local
is a place to install files built by the administrator, usually by using the make command. The idea is to avoid clashes with files that are part of the operating systems that would either be overwritten or overwrite the local ones otherwise. eg./usr/bin/foo
is part of the OS while/usr/local/bin/foo
is a local alternative,/opt
is a directory to install unbundled packages each in their own subdirectory. They are already built whole packages provided by an independent third party software distributor. For examplesomeapp
would be installed in/opt/someapp
, one of its command would be in/opt/someapp/bin/foo
[and then usually a symbolic link is made in one of thebin
directories in thePATH
, or the program is called from a desktop file (see below)].
Finding a specific program or command
.desktop
files
To find out where a specific program is installed, you can do a number of steps. First you need to locate its .desktop
file. Desktop files are simular to shortcuts in Windows, and for system applications they are located in /usr/share/applications
. The desktop files for applications that are only available for the current user are in ~/.local/share/applications
. Take for example Google Chrome, which has the desktop file /usr/share/applications/google-chrome.desktop
and look for the line that starts with Exec=
, this determines how to start Google Chrome. It says:
Exec=/opt/google/chrome/google-chrome
So you know Google Chrome is in /opt
.
Now for Mozilla Firefox which is located in /usr/share/applications/firefox.desktop
. It simply says
Exec=firefox %u
At first this doesn't seem to help that much, but then you realize that firefox
must be in a directory that is in the PATH
variable (most likely a bin
), and we can look it up (see below).
Looking up commands
To look up commands you can use one or more of the following: type
, which
and whereis
(I've included a link to their manual pages online).
type: it describes a command, and indicates how it would be interpreted if used as a command name. Possible types for a command are:
- alias (shell alias)
- function (shell function)
- builtin (shell builtin)
- file (disk file)
- keyword (shell reserved word)
(type itself is a shell builtin, try it with
type type
:P)Executing
type firefox
gives usfirefox is /usr/bin/firefox
which is what we wanted to know
If a command is a file (which you checked with type
) you can then also use:
which: shows the full path of the command,
Executing
which firefox
gives us/usr/bin/firefox
whereis: locate the binary, source, and manual page files for a command.
Executing
whereis firefox
gives usfirefox: /usr/bin/firefox /etc/firefox /usr/lib/firefox /usr/lib64/firefox /usr/bin/X11/firefox /usr/share/man/man1/firefox.1.gz
Bonus
You can inspect /usr/bin/firefox
closer with ls -l /usr/bin/firefox
and this gives:
/usr/bin/firefox -> ../lib/firefox/firefox.sh*
It appears that /usr/bin/firefox
is 'only' a symbolic link to the script /usr/lib/firefox/firefox.sh
. If you inspect the script you discover that the script calls /usr/lib/firefox/firefox
.
You may rest in peace now :)
-
Pretty cool answer. One question, what is Symbolic Link? Is it Windows shortcut equivalent? Jun 2, 2015 at 23:35
-
@iamcreasy thanks! Yes, they are a sort of shortcut, but with the main intention of avoiding file copies. The windows shortcuts are more comparable to. desktop files, which can be used to create, for example, startmenu items. Jun 3, 2015 at 5:37
-
Why would someone use .desktop file over symbolic links and vice versa? Jun 3, 2015 at 10:48
-
1@iamcreasy In .desktop files you can add extra information, such as a description and an icon (see an example here: standards.freedesktop.org/desktop-entry-spec/latest/apa.html), it's a 'regular' file. A symbolic link is a 'special' file that only links to another file. I find this hard to explain properly but maybe you can find a better answer here: superuser.com/questions/253935/… Jun 3, 2015 at 11:54
There is no single directory that is the exact equivalent of Program Files folder. The way Linux arranges things is a lot different than Windows.
In windows, every program that we install gets its own directory inside the Program Files directory. In that directory, further sub-directories are created for different kind of files. There is no fixed structure for sub-directories. Programs decide for themselves what they want to call each directory and where they want to put what.
But in Linux when a program is installed, different kind of files are copied to different locations. Executables are copied to /usr/bin, library files to /usr/lib, documentation to one or more of /usr/man, /usr/info and /usr/doc. If there are configuration files, they are usually in the user's home directory or in /etc.
-
Is there any reason for this grouping of files based on their purpose rather than based on the application the files belong to? Is the "Unix file grouping style" generally more convenient from a system administrator perspective?– jojmanNov 17, 2016 at 23:58
-
1not really. Its a design choice that they made I think. Although it does enable making utilities like "man", "info" or many others which depend on this file structure. For example "man" knows where to look for documentation for each command. If there is no standard location of docs, man can't work.– binWNov 23, 2016 at 15:27
The C:\Program Files
folder would be /usr/bin
in Ubuntu. /bin
looks more like C:\windows
.
From the manual page of the filesystem hierarchy:
/bin This directory contains executable programs which are needed in
single user mode and to bring the system up or repair it.
/usr/bin
This is the primary directory for executable programs. Most
programs executed by normal users which are not needed for
booting or for repairing the system and which are not installed
locally should be placed in this directory.
Ubuntu has a different structure than windows. Ubuntu places almost all applications in one directory, say /usr/bin
. Windows would make a new folder, say Mozilla Firefox
, and add configuration, executables, DLL's, images, etc. in it. Ubuntu splits them up, executables go in /usr/bin
, system-wide configuration in /etc
, shared objects in /usr/lib
, images in /usr/share
, ...
Linux 'Program Files' are in the whole hierarchy. It could be on /usr/bin
, /bin
, /opt/...
, or in another directories.
I think you are going to find some file related to your application. Then, I have an idea on how to looks files which are installed on program installation.
- Install
synaptic
by issuingsudo apt-get install synaptic
on terminal. - Look for package you want, search on the search text input.
- Right-click the package and select
Properties
. - Move to
Installed File
tab. The result is same asdpkg -L package_name
. - There you'll find all files installed for the package.
It is because linux move the installed file to directories separately based on their type.
- Executable goes to
/usr/bin
or/bin
. - Icon goes to
/usr/share/icons
or on~/.local/share/icons
for local. - Whole application (portable) on
/opt
. - Shortcut usually on
/usr/share/applications
or on~/.local/share/applications
- Documentation on
/usr/share/doc
- Library / module on
/usr/lib
And many other directories. (CMIIW, accepting correction)
In this answer when I say Unix I mean Unix as well as Unix-like operating systems.
Ubuntu doesn't really have a programs folder containing all of the data for each program. In Unix and Unix-like operating systems, EVERYTHING is a file, even the terminal commands. They're files as well. The way Unix handles programs can be pretty chaotic, and organized at the same time.
Icons for programs are stored in /usr/share/icons/*, program executables are usually stored in /usr/bin, /bin, and other places with bin directories (bin is obv short for binary). Libraries that programs depend on are in /lib.
So you end up with not a directory containing all of the data for one program, but the data for the program spread out. While at first this seems very disorganized, it allows for sharing of standard things like libraries and icons.
Thanks to permissions for each file, the idea of everything being a file is very brilliant to be honest. It makes Unix MUCH more secure than other operating systems.
The way that Linux and Windows programs are installed is quite different.
The common pattern in Windows is for a program; or a bunch of programs, from one vendor go into its own sub directory in C:\programs\vendor or something similar.
In Linux, your files are split up between specific sub directories depending on their function. There are directories for libraries, icons, man pages, Log files, configuration and so on. You may use some of them, but the system will manage all of them. They are not coupled together, but exist together with similar files from other programs.
So there is no real equivalent to that Windows directory structure in a regular Linux implementation.