UNIX & Linux Forums

UNIX & Linux Forums (https://www.unix.com/index.php)
-   Homework & Coursework Questions (https://www.unix.com/homework-and-coursework-questions/)
-   -   Unix find and head command help (https://www.unix.com/homework-and-coursework-questions/183527-unix-find-head-command-help.html)

partieboi37 04-22-2012 01:20 AM

Unix find and head command help
Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted!

1. The problem statement, all variables and given/known data:
I've been stuck on this problem for 2 days now
What command would you enter to list the first lines of all text files within your UnixCourse directory or within any directory inside there?

2. Relevant commands, code, scripts, algorithms:
i know i'm supposed to used 'find' '-exec' and 'head'
the question also says:
But you really don't want to type that command out for every file or even every directory. What command would you give to produce a listing of the names of all the text files in ~/UnixCourse or its subdirectories (possibly nested several layers deep) followed immediately by the first line of text within that file? E.g., to produce a listing looking like this:


When in the course of human development
Curiouser and curiouser!

Note that the output format must look like the example above. (That's not unreasonable, as one of the things you should have learned from this lesson is that the output of one command is often fed into later commands, which must be able to read it.) In particular, solutions that add extreneous characters around the file name (e.g., << or ==>) are not correct.

3. The attempts at a solution (include all code and scripts):
here's what i've tried so far:


find ~/UnixCourse -type file -exec head -1 {} \;
find ~/UnixCourse -name "*.txt" -print -exec head -n1 {} \;
find ~/UnixCourse.*.txt !-type d -print -exec head -n1 {} \;
find ~/UnixCourse. -name "*.txt" ! -type d head -n1 {} \
find ~/UnixCourse -name "*.txt" -print -exec head -n1 {}\;

none of those have worked and it doesn't really give me any feedback other than saying it's not the right answer. any help would be greatly appreciated as I am at my wits end.
4. Complete Name of School (University), City (State), Country, Name of Professor, and Course Number (Link to Course):
odu, chesapeake, va, zeil, cs252

Note: Without school/professor/course information, you will be banned if you post here! You must complete the entire template (not just parts of it).
Moderator's Comments:
Link: How to use code tags

agama 04-22-2012 01:35 AM

Given this is homework, I'll only hint. First, I think you are on the right track with these:


find ~/UnixCourse -type file -exec head -1 {} \;
 find ~/UnixCourse -name "*.txt" -print -exec head -n1 {} \;

You want to find all regular files in the directory, print the filename to stdout, and display the first line. So your solution would be the combination of these two commands that you've experimented with that do just that.

The first command probably isn't listing the file name, and the second command isn't considering all files.

methyl 04-22-2012 05:23 PM

This an interesting puzzle because I for one cannot come up with a simple solution which works on all modern unix and Linux O/S (the O/S was not stated) ... and which uses "find .... -exec".

In the commercial world we would use a construct which lets us do a sequence of commands within a do-done loop:

find /home/yourname/UnixCourse/ -type f -name "*.txt" -print | while read filename
    echo "${filename}"
    head -1 "${filename}"

I realise that this does not match you requirement because there is no "-exec" on the "find".

Ignoring those versions of the "find" command which support more than one command with "-exec", one must look at what "-exec" could run.
Hmm it could run a simple Shell script which displayed the filename and then displayed the first line of the file in question.
Just an idea, other posters may have better ideas.

partieboi37 04-22-2012 05:58 PM

thanks for all the help. I'm still not quite getting it. what I've gathered is:
find ~/UnixCourse -name
is how the command should begin and it should end with:
-print -exec head -n1 {} \;
however, i'm not quite sure if the syntax is right on the above, or what goes in the middle.

agama 04-22-2012 06:04 PM

I don't think you want to use the -name option. It sounded, to me at least, that you want to find all files. Using -name would limit what the find command would output. I do think you want to use the -type f option so as to have find print only regular file names, and not directory names.

As was implied by methyl, what operating system and shell are you using?

methyl 04-22-2012 06:11 PM

Amending my "find" to include ~UnixCourse:

find ~UnixCourse -type f -name "*.txt" -print

The parameters read as follows:

Start directory: ~UnixCourse
File type (a normal file) : -type f
File name: "*.txt" : Any file where the name end in ".txt".

Footnote: This is unix not MSDOS, and file extensions have no special meaning.

From the original post: list the first lines of all text files. Though I know that unix does not define file types by file extension, in this example the O/P has posted -name "*.txt in one example ... and I have copied it!

I can't vouch for the -exec command posted, but do try it on your system and see what happens.

agama 04-22-2012 06:25 PM


Originally Posted by methyl (Post 302627983)
From the original post: list the first lines of all text files. Though I know that unix does not define file types by file extension, in this example the O/P has posted -name "*.txt in one example ... and I have copied it!

Some how I managed to get "all" stuck in my head, even though both examples and attempts referenced "*.txt". Good call, and I just need to read things a bit more closely. Thanks.

All times are GMT -4. The time now is 03:11 PM.

UNIX and Linux Forums
Search Engine Optimisation provided by DragonByte SEO v2.0.32 (Pro) - vBulletin Mods & Addons Copyright © 2017 DragonByte Technologies Ltd.
Unix & Linux Forums Content Copyright©1993-2017. All Rights Reserved.
Forum Operations by The UNIX and Linux Forums