Could someone explain what crud is and how exactly grep works in this case?
file $(grep –irl crud /usr/src/linux-2.4)
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.Sign up to join this community
Let's break this down. First, the
$(command) format is called "command substitution". It is a way of returning a command's output, essentially creating a variable whose value is the output of that command. For example:
$ echo foo foo $ var=$(echo foo) ## set the output of 'echo foo' to the variable $var $ echo "$var" foo
Now, in this case, the command being run is
grep -irl crud /usr/src/linux-2.4. To understand what that means, run
man grep and see what each of those three (
l) options does:
-i, --ignore-case Ignore case distinctions in both the PATTERN and the input files. -r, --recursive Read all files under each directory, recursively, following symbolic links only if they are on the command line. Note that if no file operand is given, grep searches the working directory. This is equivalent to the -d recurse option. -l, --files-with-matches Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match.
Taken all together, that means "recurse through all the files in
/usr/src/linux-2.4 and search through each of them case-insensitively for the word
crud, then print the names of any files that match".
So, that command will print a list of file names containing the word
crud. Because we are running
file $(grep . . . ), this means that the command
file (which prints out the file type and some information about the file in question) will be run on each of the files returned by the
Putting it all together, that command will print out the basic file information about all files in
/usr/src/linux-2.4 containing the string
crud. On my 14.04 machine, that returns:
$ file $(grep -irl crud /usr/src/) /usr/src/linux-headers-3.16.0-77/include/linux/pktcdvd.h: C source, ASCII text /usr/src/linux-headers-3.16.0-77/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text /usr/src/linux-headers-3.13.0-108/include/linux/pktcdvd.h: C source, ASCII text /usr/src/linux-headers-3.13.0-108/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text /usr/src/linux-headers-3.13.0-46/include/linux/pktcdvd.h: C source, ASCII text /usr/src/linux-headers-3.13.0-46/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text /usr/src/linux-headers-3.16.0-30/include/linux/pktcdvd.h: C source, ASCII text /usr/src/linux-headers-3.16.0-30/arch/arm/mach-sa1100/include/mach/cerf.h: ASCII text
file according to the help, determines the Type of the processed file. The command
$(grep -irl crud /usr/src/linux-2.4) is:
$(<command>)Captures the value of the inside command.
grep -irl crud /usr/src/linux-2.4, is the inside command, which is searching for the string crud, with ignore case, recursively and print only names of files containing matches.
So, your complete command, is looking for the type of the files that match the string crud, inside the directory