While researching another problem, I came across a command,locate something | xargs -I {} bash -c if [ -d {} ]; then echo {}; fithat I wanted to learn more about.  So I ran man xargs and get the following output:XARGS(1)                    General Commands Manual                   XARGS(1)NAME       xargs - build and execute command lines from standard inputSYNOPSIS       xargs  [-0prtx]  [-E  eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null]       [-d delimiter] [--delimiter delimiter]  [-I  replace-str]  [-i[replace-       str]]    [--replace[=replace-str]]   [-l[max-lines]]   [-L   max-lines]       [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s  max-       chars]  [--max-chars=max-chars]  [-P max-procs] [--max-procs=max-procs]       [--interactive]      [--verbose]      [--exit]      [--no-run-if-empty]       [--arg-file=file]   [--show-limits]   [--version]   [--help]   [command       [initial-arguments]]DESCRIPTION       This manual page documents the GNU version of xargs...I am trying to get better at using documentation to learn about Linux programs, but that Synopsis section is intimidating to new users.  It literally looks like gibberish compared to man locate or man free.So far, I understand that square brackets mean optional and nested brackets mean options in optional.  But how am I supposed to induce a valid command with that?I am not asking for help with xargs here.  I am looking for help interpreting a man page to understand complicated commands.  I want to stop making Google-indexed web blogs and personal help from others my first approach to learning Linux commands.
How do I use man pages to learn how to use commands?
man
Well, this is my very personal way to read manpages:Have in mind what you want to do.When doing your research about xargs you did it for a purpouse, right? You had a specific need that was reading standard output and executing commands based on that output.But, when I don't know which command I want?Use man -k or apropos (they are equivalent). If I don't know how to find a file: man -k file | grep search. Read the descriptions and find one that will better fit your needs. Example:apropos -r '^report'bashbug (1)          - report a bug in bashdf (1)               - report file system disk space usagee2freefrag (8)       - report free space fragmentation informationfilefrag (8)         - report on file fragmentationiwgetid (8)          - Report ESSID, NWID or AP/Cell Address of wireless networkkbd_mode (1)         - report or set the keyboard modelastlog (8)          - reports the most recent login of all users or of a given userpmap (1)             - report memory map of a processps (1)               - report a snapshot of the current processes.pwdx (1)             - report current working directory of a processuniq (1)             - report or omit repeated linesvmstat (8)           - Report virtual memory statisticsApropos works with regular expressions by default, (man apropos, read the description and find out what -r does), and on this example I'm looking for every manpage where the description starts with report.Always read the DESCRIPTION before startingTake a time and read the description. By just reading the description of the xargs command we will learn that:xargs reads from STDIN and executes the command needed. This also means that you will need to have some knowledge of how standard input works, and how to manipulate it through pipes to chain commandsThe default behavior is to act like /bin/echo. This gives you a little tip that if you need to chain more than one xargs, you don't need to use echo to print.We have also learned that unix filenames can contain blank and newlines, that this could be a problem and the argument -0 is a way to prevent things explode by using null character separators. The description  warns you that the command being used as input needs to support this feature too, and that GNU find support it. Great. We use a lot of find with xargs.xargs will stop if exit status 255 is reached.Some descriptions are very short and that is generally because the software works on a very simple way. Don't even think of skipping this part of the manpage ;)Other things to pay attention...You know that you can search for files using find. There is a ton of options and if you only look at the SYNOPSIS, you will get overwhelmed by those. It's just the tip of the iceberg. Excluding NAME, SYNOPSIS, and DESCRIPTION, you will have the following sections:AUTHORS: the people who created or assisted in the creation of thecommand.BUGS: lists any known defects. Could be only implementation limitations.ENVIRONMENT: Aspects of your shell that could be affected by the command, or variables that will be used.EXAMPLES or NOTES: Self explanatory.REPORTING BUGS: Who you will have to contact if you find bugs on this tool or in its documentation.COPYRIGHT: Person who created and disclaimers about the software. All related with the license of the software itself.SEE ALSO: Other commands, tools or working aspects that are related to this command, and could not fit on any of the other sections.You will most probably find interesting info about the aspects you want of a tool on the examples/notes section.PagerWhen you open a manpage, it will be displayed by the less or more commands. I suggest you switch to less whenever possible. If you are using Linux you are probably served with your man infrastructure already configured to use /usr/bin/less -is (unless you installed some minimal distro) as man(1), explain on it's Options section:-P pagerSpecify which pager to use. This option overrides the MANPAGER environment variable, which in turn overrides the PAGER variable. By default, man uses /usr/bin/less -is.ExampleOn the following steps I'll take find as an example, since it's concepts are more simple than xargs to explain(one command find files and the other deals with stdin and pipelined execution of other command output). Let's just pretend that we know nothing(or very little) about this command. I have a specific problem that is: I have to look for every file with the .jpg extension, and with 500KiB (KiB = 1024 byte, commonly called kibibyte), or more in size inside a ftp server folder.First, open the manual: man find. The SYNOPSIS is slim. Let's search for things inside the manual:  Type / plus the word you want (size). It will index a lot of entries -size that will count specific sizes. Got stuck. Don't know how to search with more than or less than a given size, and the man does not show that to me.Let's give it a try, and search for the next entry found by hitting n. OK. Found something interesting: find \( -size +100M -fprintf /root/big.txt %-10s %p\n \). Maybe this example is showing us that with -size +100M it will find files with 100MB or more. How could I confirm? Going to the head of the manpage and searching for other words.Again, let's try the word greater. Pressing g will lead us to the head of the manpage. /greater, and the first entry is: Numeric arguments can be specified as    +n     for **greater** than n,    -n     for less than n,     n      for exactly n.Sounds great. It seems that this block of the manual confirmed what we suspected. However, this will not only apply to file sizes. It will apply to any n that can be found on this manpage (as the phrase said: Numeric arguments can be specified as).Good. Let us find a way to filter by name: g /insensitive. Why? Insensitive? Wtf? We have a hypothetical ftp server, where that other OS people could give a file name with extensions as .jpg, .JPG , .JpG. This will lead us to:-ilname pattern              Like  -lname,  but  the  match  is  case insensitive.  If the -L              option or the -follow option is in  effect,  this  test  returns              false unless the symbolic link is broken.However, after you search for lname you will see that this will only search for symbolic links. We want real files. The next entry:    -iname pattern          Like -name, but the match is case insensitive.  For example, the          patterns `fo*' and `F??' match  the  file  names  `Foo',  `FOO',          `foo',  `fOo',  etc.   In these patterns, unlike filename expan          sion by the shell, an initial '.' can be matched by  `*'.   That          is, find -name *bar will match the file `.foobar'.   Please note          that you should quote patterns as a matter of course,  otherwise          the shell will expand any wildcard characters in them.Great. I don't even need to read about -name to see that -iname is the case insensitive version of this argument. Lets assemble the command:Command: find /ftp/dir/ -size +500k -iname *.jpgWhat is implicit here: The knowledge that the wildcard ? represents any character at a single position and * represents zero or more of any character. The -name parameter will give you a summary of this knowledge.When this method will not work so well...Manpages that have no examplesManpages where options have a short explanationWhen you use generic keywords like and, to, for inside the manpagesIn some cases the examples will be pretty simple, and you will have to make some executions of your command to test, or in a worst case scenario, Google it.Tips that apply to all commandsSome options, mnemonics and syntax style travel through all commands making you buy some time by not having to open the manpage at all. Those are learned by practice and the most common are:Generally, -v means verbose. -vvv is a variation very very verbose on some software.Following the POSIX standard, generally one dash arguments can be stacked. Example: tar -xzvf,  cp -Rv.Generally -R and/or -r means recursive.Almost all commands have a brief help with the --help option.--version shows the version of a software.-p, on copy or move utilities means preserve permissions.-y means YES, or proceed without confirmation in most cases.Note that the above are not always true though. For example, the -r switch can mean very different things for different software. It is always a good idea to check and make sure when a command could be dangerous, but these are common defaults. Default values of commands.At the pager chunk of this answer, we saw that less -is is the pager of man. The default behavior of commands are not always shown at a separated section on manpages, or at the section that is most top placed.You will have to read the options to find out defaults, or if you are lucky, typing /pager will lead you to that info. This also requires you to know the concept of the pager(software that scrolls the manpage), and this is a thing you will only acquire after reading lots of manpages.Why is that important? This will open up your perception if you find differences on scroll and color behavior while reading man(1) on Linux(less -is pager) or FreeBSD man(1) for example.And what about the SYNOPSIS syntax?After getting all the information needed to execute the command, you can combine options, option-arguments and operands inline to make your job done. Overview of concepts:Options are the switches that dictates a command behavior. Do thisdon't do this or act this way. Often called switches. Option-arguments are used on most cases when an option isntbinary(on/off) like -t on mount, that specifies the type of afilesystem(-t iso9660, -t ext2). Do this with closed eyes orfeed the animals, but only the lions. Also called arguments.Operands are things you want that command to act upon. If you usecat file.txt, the operand is a file inside your currentdirectory, and its contents will be shown on STDOUT. ls is acommand where an operand is optional. The three dots after the operandimplicitly tells you that cat can act on multiple operands(files) at the same time. You may notice that some commands have set what type ofoperand it will use. Example: cat [OPTION] [FILE]... Related synopsis stuff:12. Utility Conventions - The Open Group Base Specifications Issue 7 - IEEE Std 1003.1, 2013 EditionUnderstand synopsis in manpage