Teaching:
Feedback
To unify standard locations for files in Linux, a document Filesystem Hierarchy Standard has been created. Basing on traditional and commonly employed directory structures in Unix-like operating systems, the document recommends a converged directory structure, specifying intended use for the directories.
Typically in Linux the system manual has an entry hier (and, in case of
systemd-based distributions, also file-hierarchy) that summarises the
directory hierarchy used in the system.
Exercise 1 On the basis of FHS / man hier refer the purpose of the following directories:
• /bin, /usr/bin and /sbin, /usr/sbin
• /lib and /usr/lib
• /usr/share
• /etc
• /opt
• /root and /home
• /tmp
• /var
The locate tool
looks up words or wildcard expressions provided as arguments in a previously
generated list of files.
The list (or base) of files is usually updated daily - most distributions
ship alongside locate a scheduled task that daily runs the command updating
the database (updatedb).
Contemporary implementations of locate verify, right before displaying the
results, whether the matching file still exist and whether the user has
sufficient permissions to access the file.
Unrestricted access to the complete list of files present in a system
is considered a security vulnerability, hence the systems deploy various access
restrictions to the list.
Exercise 2 Use locate --statistics to display file database statistic.
With --regex switch, the locate treats all arguments as regular
expressions.
Otherwise, each argument arg that contains no wildcards 1)
is actually converted to a wildcard expression *arg* before matching
against the entries in the database.
Exercise 3 Compare the results of the following commands:
• locate 'stdint'
• locate '*stdint'
• locate --regex '.*stdint'
• locate --regex '.*stdint$'
locate matches all arguments against full file path (or only against filename,
if -b is given), and outputs a file name if at least one argument matches.
To require a match against all arguments, one has to add the -A (--all)
switch.
Exercise 4 Compare the following commands:
• locate -A bin ps to pdf vs locate bin ps to pdf
• locate -b netpbm vs locate netpbm
The option -0 makes the locate separate the output file paths with
a null byte ('\0') instead of a newline ('\n').
Exercise 5
Locate files which name is exactly bin.
Exercise 6
Locate files that contain pause in the filename and icons in the full path.
Exercise 7
Locate files that contain a [ character in their names.
The find utility scouts
recursively the directories to look for files matching the provided filters and
executes the user-specified action (or just prints the paths of matching files
if no action is provided).
While the find utility is part of
POSIX standard,
most implementations cover more functionality than what the standard mandates.
These materials summarise the implementation of find from GNU findutils
(which is commonly used in Linux).
The find command has two noteworthy switches:
-L follows symlinks (default),
-H des not follows symlinks (and only then find may be used to look for symlinks).
find has a fixed and counter-intuitive syntax – options come first, but
then one must list paths to search, and only after all paths one may provide
tests and actions.
Upon omitting list of paths, find searches in the current directory.
Upon omitting actions, find prints the matching filenames to the standard output.
The order of the arguments matters.
find -ls -name '*bash*' first lists each encountered file, and then checks if the filename contains 'bash',
find -name '*bash*' -ls first checks if the filename contains 'bash', and lists the file only if the test succeeded.
| Basic tests: | |
find … | matches: |
|---|---|
-name pattern -iname pattern | file name to the pattern ( -i performs case-insensitive match) |
-path pattern -ipath pattern | file path to the pattern ( -i performs case-insensitive match) |
-type {f|d|l|p|s|c|b} | file type – f for ordinary file, d for directory, l for symlink, etc. |
-user name -group name | file owner / group |
-perm mode -perm -mode -perm /mode | permissions: same as provided - all provided bits set / at least one of the provided bits set mode can be either octal ( 22) or symbolic (go+w) |
-size s | size; 512c stands for 512B; 512M stands for 512MB; -512c stands for at most 512B, +512c stands for at least 512B Warning: the default unit, denoted with b, are dist blocks, not bytes |
-atime d / -amin min -ctime d / -cmin min -mtime d / -mmin min | times: access, change, modification in days or minutes |
The tests can be:
-a (logical and, used when no operator is specified) and -o (logical or) find -name baz -o -name bar( and ), but beware – parentheses are treated specially by bash, hence one must escape them as \( and \) find -size -1M \( -name baz -o -name bar \)! find ! -type f ! -type d
Other important tests include:
-mindepth n and -maxdepth n specify how deep find will scot the directories.
-xdev forbids entering directories where other filesystems are mounted.
That is: if one looks for a file in /, then find will not scout the /mnt/cdrom directory if a compact disc has been mounted there.
| Selected actions: | |
-print | the default action - prints filenames separated by a newline |
-print0 | prints filenames separated by a null byte |
-delete | removes matching files |
-exec … {} … ; | executes provided program, for each matching file separately (see below) |
-exec … {} + | executes provided program, for all matching files at once (see below) |
find -exec program arg1 arg2 \{\} \; finds the files: one, two i three, then it executes:program arg1 arg2 oneprogram arg1 arg2 twoprogram arg1 arg2 three
If find -exec program arg1 arg2 \{\} + finds the files: one, two i three, then it executes:
program arg1 arg2 one two three
In -exec, each occurrence of the {} expression gets replaced by the filename.
Warning: {} (and ;) are treated specially by the shell, hence they must be
escaped (that is, \{\}) or enclosed in quotation marks ("{}").
In the -exec … {} + syntax, the argument {} must appear once, as the last argument.
Exercise 8 Issue, from your home directory, the commands find (with no
arguments), find .config/.. oraz find ~.
How do the results differ?
Exercise 9 Find all files in the /srv/ and /var/lib/zypp/ directories
using one command.
Exercise 10 Find, in your home directory, files which names end with .xml.
Exercise 11 Find empty files in your home directory
Exercise 12 Find and display files in /usr/include that are not greater
than 32 bytes.
Warning: for find the unit b or no unit denotes disk blocks.
Bytes are denoted c.
Exercise 13 Find all files outside your home directory.
Exercise 14 Find files with no read permission for the group in your home directory.
Exercise 15
Execute the command: find \( -type d -ls \) -o \( -print \).
When the action -ls is executed, and when the action -print is executed?
What and why would happen of one would remove the parentheses?