Problem :
My teacher gave me a homework on combining find and file
Use find and file to display all files in the /home subdirectory tree,
as well as a guess at what sort of a file they are.
I tried using pipeline but it didn’t work out as I thought. Any ideas on how to combine both commands? Thanks! =)
Solution :
Here’s a hint. You use the file
command as an argument of the find
command. Below is the output of my find
command’s help. Take a look at the “actions” section to see how you can use the file
command with the find
command.
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
default path is the current directory; default expression is -print
expression may consist of: operators, options, tests, and actions:
operators (decreasing precedence; -and is implicit where no others are given):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
positional options (always true): -daystart -follow -regextype
normal options (always true, specified before other expressions):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race
tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
-readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]
actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
Report (and track progress on fixing) bugs via the findutils bug-reporting
page at http://savannah.gnu.org/ or, if you have no web access, by sending
email to <bug-findutils@gnu.org>
.
You should do your homework but anyway is your problem…
find /home -type f -exec file {} ;
-type specifies the result (f for file)
-exec executes a program
{} Is the name of file
Better and more efficient solution:
find /home -type f -print0 | xargs -0 file
The above implementation assumes a later version of find and a Linux implementation. -print0 allows for those cases where special reserved characters are contained in the filename…you know like SPACES!