Du stößt gerade auf Probleme mit dem Pattern/Suchmuster in der Shell 😉
Diese Meldung von grep bzgl. "Kopie" kommt von einem Dateinamen bzw. Dir-Namen,
der Leerzeichen/Sonderzeichen enthält. Z.B.:
[gerhard@tux1 test]$ ls -1 .
hallo
hallo (Kopie).php
hallo1.php
1. Fehler:
[gerhard@tux1 test]$ find /home/gerhard/test -type f -iname *.php
find: Der Pfad muß vor dem Suchkriterium stehen.
Usage: find [-H] [-L] [-P] [path...] [expression]
Dieser kommt daher, daß "hallo (Kopie)" durch die Shell in zwei Teile gespaltet wird und
dann die Syntax von find nicht mehr stimmt.
Wenn also Datei/Dir-Namen solche Sonderzeichen enthalten können das Suchmuster
immer maskieren:
find /home/gerhard/test -type f -iname "*.php"
2. Fehler
[gerhard@tux1 test]$ find /home/gerhard/test -type f -iname "*.php" | xargs grep -l smill
grep: (Kopie).php: Datei oder Verzeichnis nicht gefunden
/home/gerhard/test/hallo1.php
Hier haben wir deinen angesprochenen Fehler. Dieser entsteht auch durch fehlende bzw.
falsche Maskierung, diesmal aber bei der Übergabe von find an die Pipe zu grep.
find übergibt stdout per Default durch den Parameter
-print. Dieser berücksichtigt
aber solche "Fehler" in den Namen nicht. Dafür gibt es
-print0 und im Zusammenspiel
mit xargs
-0 als Option für stdin von xargs.
Der richtige Befehl für deinen Fall lautet:
[gerhard@tux1 test]$ find /home/gerhard/test -type f -iname "*.php" -print0 | xargs -0 grep -l smill
/home/gerhard/test/hallo1.php
Also: "*.php" (in Anführungszeichen)
findet korrekt,
-print0 übergibt korrekt an
stdout und
-0 bei xargs übernimmt stdin korrekt.
Diese Problematik wird auch in der manpage von find behandelt, in den Beispielen
und auch bei der Beschreibung von -iname pattern.