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:

/home/yourname/UnixCourse/foo.txt
When in the course of human development
/home/yourname/UnixCourse/Quotations/bar.txt
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.

  1. 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).

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.

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
do
     echo "${filename}"
     head -1 "${filename}"
done

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.

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.

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?

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.

@agama
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.

1 Like

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.

1 Like

I'm using putty in wndows 7

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

shows me all the text files and when i add

-exec head -n1 {} \;

it shows the first line underneath. however, when i try it within the hw assignment on the same program i get this:

find 'head' terminated by signal 13
head: error reading '../fileAsst/TweedleDee/hatters.txt': is a directory

and it says that for every text file within UnixCourse and all its sub directories. I can't understand why i get a different output.

You're mistaking the TV for the channel, PUTTY is not UNIX, PUTTY is just a terminal emulator used to talk to other systems.

If you don't know what your system is, you should find out because it's important. uname -a

ok my bad.
linux atria 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

when i try it within the hw assignment
Please post the script you ran which produced the error messages.

Ps. Does my script in post #3 run on your system and produce the desired result?
(It will tell us a lot about your local system).

the first code you posted didn't work, but your second i just added

-exec -head -n1 {} \;

and it worked. they way we're supposed to do the assignment is we have two sessions of putty up on the same server. on one it has a question that we have to provide code to answer. on the other, we try out code to answer the question. so the script is

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

when i execute it, it gives me (or at least i think it gives me) the desired output, but when i execute in the assignment in the same program it gives me the error message.