Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted!
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?
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.
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?
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.
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.
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
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.