This shows you the differences between two versions of the page.
— |
os_cp:locate_find [2024/03/11 20:28] (current) jkonczak utworzono |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | <small> | ||
+ | ===== FHS ===== | ||
+ | |||
+ | To unify standard locations for files in Linux, a document | ||
+ | [[https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard|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.#~~ 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'' | ||
+ | </small> | ||
+ | |||
+ | ===== Searching files ===== | ||
+ | |||
+ | ==== locate ==== | ||
+ | |||
+ | The ''**[[https://en.wikipedia.org/wiki/Locate_(Unix)|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. | ||
+ | \\ | ||
+ | <small>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.</small> | ||
+ | |||
+ | ~~Exercise.#~~ Use ''locate --statistics'' to display file database statistic. | ||
+ | |||
+ | <small> | ||
+ | With ''--regex'' switch, the ''locate'' treats all arguments as regular | ||
+ | expressions. | ||
+ | \\ | ||
+ | Otherwise, each argument ''//arg//'' that contains no wildcards ((as understood | ||
+ | by the [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13|shell]] | ||
+ | – that is, ''*'' standing for any text, ''?'' standing for any character , and ''[…]'' standing for a range.)) | ||
+ | is actually converted to a wildcard expression ''*//arg//*'' before matching | ||
+ | against the entries in the database. | ||
+ | |||
+ | ~~Exercise.#~~ Compare the results of the following commands: | ||
+ | \\ • ''locate 'stdint'%%%%'' | ||
+ | \\ • ''locate '*stdint'%%%%'' | ||
+ | \\ • ''locate --regex '.*stdint'%%%%'' | ||
+ | \\ • ''locate --regex '.*stdint$'%%%%'' | ||
+ | </small> | ||
+ | |||
+ | <small> | ||
+ | ''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.#~~ 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'). | ||
+ | </small> | ||
+ | |||
+ | ~~Exercise.#~~ | ||
+ | Locate files which name is exactly ''bin''. | ||
+ | |||
+ | ~~Exercise.#~~ | ||
+ | Locate files that contain ''pause'' in the filename and ''icons'' in the full path. | ||
+ | |||
+ | <small> | ||
+ | ~~Exercise.#~~ | ||
+ | Locate files that contain a ''['' character in their names. | ||
+ | </small> | ||
+ | |||
+ | ==== find ==== | ||
+ | |||
+ | The ''**[[https://en.wikipedia.org/wiki/Find_(Unix)|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 | ||
+ | [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html|POSIX standard]], | ||
+ | most implementations cover more functionality than what the standard mandates. | ||
+ | \\ | ||
+ | These materials summarise the implementation of ''find'' from [[https://www.gnu.org/software/findutils/|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. | ||
+ | |||
+ | === Tests === | ||
+ | |||
+ | |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 //d//ays or //min//utes| | ||
+ | |||
+ | The tests can be: | ||
+ | * joined with ''-a'' (logical //and//, used when no operator is specified) and ''-o'' (logical //or//) \\ eg., ''find -name //baz// -o -name //bar//'' | ||
+ | * grouped in parentheses – ''('' and '')'', but beware – parentheses are treated specially by bash, hence one must escape them as ''\('' and ''\)'' \\ eg., ''find -size -1M \( -name //baz// -o -name //bar// \)'' | ||
+ | * negated by ''!'' \\ eg., ''find ! -type f ! -type d'' | ||
+ | |||
+ | <small> | ||
+ | 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. | ||
+ | </small> | ||
+ | |||
+ | <small> | ||
+ | === Actions === | ||
+ | |||
+ | |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)| | ||
+ | |||
+ | <html><div></html> | ||
+ | If ''find -exec program arg1 arg2 \{\} \;'' finds the files: ''one'', ''two'' i ''three'', then it executes:\\ | ||
+ | <html><div style="display:inline-block;line-height: 1em"></html> | ||
+ | ''program arg1 arg2 one''\\ | ||
+ | ''program arg1 arg2 two''\\ | ||
+ | ''program arg1 arg2 three'' | ||
+ | <html></div></div></html> | ||
+ | |||
+ | 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. | ||
+ | |||
+ | </small> | ||
+ | |||
+ | === Exercises === | ||
+ | |||
+ | ~~Exercise.#~~ Issue, from your home directory, the commands ''find'' (with no | ||
+ | arguments), ''find .config/..'' oraz ''find ~''. \\ How do the results differ? | ||
+ | |||
+ | ~~Exercise.#~~ Find all files in the ''/srv/'' and ''/var/lib/zypp/'' directories | ||
+ | using one command. | ||
+ | |||
+ | ~~Exercise.#~~ Find, in your home directory, files which names end with ''.xml''. | ||
+ | |||
+ | ~~Exercise.#~~ Find empty files in your home directory | ||
+ | |||
+ | <small> | ||
+ | ~~Exercise.#~~ 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''. | ||
+ | </small> | ||
+ | |||
+ | ~~Exercise.#~~ Find all files outside your home directory. | ||
+ | |||
+ | ~~Exercise.#~~ Find files with no read permission for the group in your home | ||
+ | directory. | ||
+ | |||
+ | <small> | ||
+ | ~~Exercise.#~~ | ||
+ | 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? | ||
+ | </small> | ||
+ | |||
+ | |||
+ | ~~META: | ||
+ | language = en | ||
+ | ~~ | ||