Today I learned a situation in which is good to use a for loop in a shell in moments when the -exec flag alone is difficult to use.
The find command in any case is very powerful and can assist in many shell tasks. Usually when executing commands on a set of file the find
command, together with the -exec
expression in the find $PATH -exec $COMMAND {} \;
instruction, is very useful to write short and meaningful operations like
find ./ -name $PATTERN -exec cat {} \;
to print the content of a list of files denoted by the PATTERN variable.
However, it is not very useful when the situation gets complex like in this scenario.
Suppose we have 2 files:
-
file1 with content
-l
-
file2 with content
-a
And we want to run ls
with the options found in these files.
In this context the command
find ./ -name "file*" -exec ls $(cat {}) \;
would not work (the error would be "cat: {}: No such file or directory").
In this situation a classic for range loop will help us achieve this goal. As in this example
for i in $(find ./ -name "file*"); do ls $(cat $i); done
Despite being very unconventional uses of those instructions, I propose these examples to draw a line on where the find
command manages to do the job alone and where it is more helpful to include its resuls it in a for range
loop.
Hope this was helpful, thanks a lot for your time reading it!
Top comments (0)