0

I have the following instructions:

  1. Find all files in the directory /x/y/z with the extension .jpg.
  2. Write a list of matching filenames, one per line, to the file /x/y/file1.txt.
  3. Ensure that you specify the absolute path to each file.

Can you assist with understanding this instruction? I initially thought of using the following command:

find /x/y/z -name '*.jpg' -exec basename '{}' >> /x/y/file1.txt \; 

However, given the last instruction (...absolute path), I consider:

find /x/y/z -name '*.jpg' -exec pathname '{}' >> /x/y/file1.txt \; 

Which is the correct response (command) to the question/instruction?

1
  • It seems that requirements #2 and #3 are either in opposition, or the word filenames should be taken to mean pathnames. In this case ls /x/y/z/*.jpg >/x/y/file1.txt would suffice, but it's not clear to me how to satisfy both #2 and #3 if filenames is taken as its usual meaning of a filename component without path Commented Aug 12, 2021 at 18:38

1 Answer 1

1

In this answer I'm assuming that the second point of your instructions actually means "pathnames" rather than "filenames". The third point does not make sense otherwise.

The find utility will, by default, output the full path to the found files, relative to the top-level search path.

In the command

find /x/y/z -name '*.jpg' -print 

... find will print out pathnames like /x/y/z/foo/bar/baz.jpg. If the top-level search path is the absolute pathname to some directory, then the output would automatically be absolute pathnames to found files.

On the other hand, if you're using

find x/y/z -name '*.jpg' -print 

(note the lack of / at the start of x/y/z), then you will obviously get relative pathnames outputted.

You may turn these into absolute pathnames using the utility realpath on Linux:

find x/y/z -name '*.jpg' -exec realpath {} + 

This calls realpath with batches of found pathnames.

On non-Linux systems, the same realpath utility may be installed if one installs GNU coreutils (but it may then be called grealpath).

See also man realpath (or man grealpath).


Re-reading your instructions, there is nothing in them that implies that you should be using find. You don't need to use find if you're only concerned with the names in a single directory.

The exercise could just as well be solved by

printf '%s\n' /x/y/z/*.jpg >/x/y/file1.txt 

This lists all names ending with .jpg in the directory /x/y/z. If you don't have the absolute path to that directory at hand, then use

realpath x/y/z/*.jpg >/x/y/file1.txt 
1
  • Thanks @Kusalananda and roamima. This is very helpful. I will work with these insights. Commented Aug 12, 2021 at 19:01

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.