Hi Guys<div><br></div><div>------------------------------------------</div><div>Given these files :</div><div><br></div><div><div>paul@gould:~/test> find -type f -exec cat -- {} \; -print</div><div>fish</div><div>./fish.html.fred</div>
<div>fish</div><div>./-r hello.html</div><div>fish</div><div>./hello world.html</div><div>fish</div><div>./fred.html</div><div>paul@gould:~/test> </div></div><div>---------------------------------------------</div><div>
This command works for me - (adding -print to show which files are processed)</div><div><br></div><div><div>paul@gould:~/test> find -name '*.html' -type f -exec sed -i -e 's/fish/chips/g' -- {} \; -print</div>
<div>./-r hello.html</div><div>./hello world.html</div><div>./fred.html</div><div>---------------------------------------------------------------</div><div>Show the results:</div><div><br></div><div><div>paul@gould:~/test> find -type f -exec cat -- {} \; -print</div>
<div>fish</div><div>./fish.html.fred</div><div>chips</div><div>./-r hello.html</div><div>chips</div><div>./hello world.html</div><div>chips</div><div>./fred.html</div><div>paul@gould:~/test> </div></div><div><br></div>
<div>I always put single quotes around the wildcard to -name. In my experience 'find' always intelligently handles filenames with spaces etc so is usually a better</div><div>solution than explicit loops.</div><div>
<br></div><div>Regards</div><div>Paul</div><div><br></div><br><div class="gmail_quote">On 1 November 2011 14:58, James Hawtin <span dir="ltr"><<a href="mailto:oolon@ankh.org">oolon@ankh.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
tid wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
A colleague asked my opinion as to whether I felt the following was a correct answer to an test question:<br>
<br>
  Q: Please supply a one-line command to substitute all occurences of 'fish' to 'chips' in all files ending in .html<br>
  -A: $ for i in *.html ; do sed -i -e 's/fish/chips/g' $i ; done<br>
<br>
</blockquote>
I think it is valid I see no reason why a for loop is worse than say<br>
<br>
find . -name "*.html" -exec sed -i -e 's/fish/chips/g' '{}' \;<br>
<br>
However this is ALSO wrong... it should be<br>
<br>
find . -name "*.html" -exec sed -i -e 's/fish/chips/g' -- '{}' \;<br>
<br>
because it would not work with "-r hello.html" or "hello world.html"<br>
<br>
$ ls -l<br>
total 0<br>
-rw-rw-r-- 1 oolon ankh 0 Nov  1 14:43 fish.html.fred<br>
-rw-rw-r-- 1 oolon ankh 0 Nov  1 14:52 fred.html<br>
-rw-rw-r-- 1 oolon ankh 0 Nov  1 14:51 hello world.html<br>
-rw-rw-r-- 1 oolon ankh 0 Nov  1 14:51 -r hello.html<br>
<br>
for i in *.html ; do sed -i -e 's/fish/chips/g' $i ; done<br>
sed: can't read hello: No such file or directory<br>
sed: can't read world.html: No such file or directory<br>
sed: can't read hello.html: No such file or directory<br>
<br>
Personally I hate using -exec (not sure why) and generally do a "find | while read" insted, because a for loop from a glob has a finite number of argument it can handle (however it is very large with linux these days).<br>

<br>
James<br><font color="#888888">
--<br>
Gllug mailing list  -  <a href="mailto:Gllug@gllug.org.uk" target="_blank">Gllug@gllug.org.uk</a><br>
<a href="http://lists.gllug.org.uk/mailman/listinfo/gllug" target="_blank">http://lists.gllug.org.uk/<u></u>mailman/listinfo/gllug</a><br>
</font></blockquote></div><br><br clear="all"><div><br></div>-- <br>Tel: +44 79 8532 7353<div>LinkedIn: <a href="http://uk.linkedin.com/pub/paul-hewlett/0/629/9b4" target="_blank">http://uk.linkedin.com/pub/paul-hewlett/0/629/9b4</a></div>
<div><br></div><div><br></div><br>
</div>