There are variations, but also common themes and well-established guidelines.

Example 1

root (/) hierarchy:

DirectoryDescription
binEssential command binaries (e.g. ls, rm, chmod, perl, bash…)
bootStatic files of the boot loader
devDevice files (e.g. console, null, tty, stdin/out/err)
etcHost-specific system configuration (e.g. hosts, fstab)
libEssential shared libraries and kernel modules
mediaMount point for removeable media
mntMount point for mounting a filesystem temporarily
optAdd-on application software packages
sbinEssential system binaries (e.g. fdisk, fsck)
srvData for services provided by this system
tmpTemporary files
usrSecondary hierarchy
varVariable data (e.g. mail)

Example 2

Another example:

usr hierarchy:

DirectoryDescription
binMost user commands (usually installed by package manager)
includeHeader files included by C programs
libLibraries
localLocal hierarchy (empty after main installation)
sbinNon-vital system binaries
shareArchitecture-independent data

/usr/local hierarchy:

DirectoryDescription
binLocal binaries (not installed by package manager - eg. compiled)
etcHost-specific system configuration for local binaries
gamesLocal game binaries
includeLocal C header files
libLocal libraries
manLocal online manuals
sbinLocal system binaries
shareLocal architecture-independent hierarchy
srcLocal source code

Where do I Install my Stuff?

Broadly speaking…

By convention, software compiled and installed manually (not through a package manager, e.g apt, yum, pacman) is installed in /usr/local/.

If you just need to extract a tarball and run directly (e.g. Firefox) then put it into /opt/.

Why So Many Variations?

https://unix.stackexchange.com/questions/8656/usr-bin-vs-usr-local-bin-on-linux

(1) /bin/
(2) /sbin/
(3) /usr/bin/
(4) /usr/local/bin/
(5) /usr/local/sbin/

  1. /bin (and /sbin) were intended for programs that needed to be on a small / partition before the larger /usr, etc. partitions were mounted. These days, it mostly serves as a standard location for key programs like /bin/sh, although the original intent may still be relevant for e.g. installations on small embedded devices.
  2. /sbin, as distinct from /bin, is for system management programs (not normally used by ordinary users) needed before /usr is mounted.
  3. /usr/bin is for distribution-managed normal user programs.
  4. There is a /usr/sbin with the same relationship to /usr/bin as /sbin has to /bin.
  5. /usr/local/bin is for normal user programs not managed by the distribution package manager, e.g. locally compiled packages. You should not install them into /usr/bin because future distribution upgrades may modify or delete them without warning.
  6. /usr/local/sbin, as you can probably guess at this point, is to /usr/local/bin as /usr/sbin to /usr/bin.

In addition, there is also /opt which is for monolithic non-distribution packages, although before they were properly integrated various distributions put Gnome and KDE there. Generally you should reserve it for large, poorly behaved third party packages such as Oracle.

Run the man hier command to see what you have.

A diagram from here: