Suchergebnis ohne ./ verwenden

Suchergebnis ohne ./ verwenden

Ich versuche, mit find eine Reihe von symbolischen Links zu erstellen, aber das Ergebnis mit {} enthält vor jedem Dateinamen ./. Wie kann ich das vermeiden?

find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;

Antwort1

Sie müssen nur ein Zeichen in Ihrem Befehl ändern:

find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
#    ^

Antwort2

Verwenden Sie die Standardsyntax, etwa:

S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
  for i do
    ln -s -- "$S${i#.}" "$D/$i"
  done' sh {} +

Wenn Sie GNUismen verwenden möchten, können Sie Folgendes tun:

find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
  xargs -r0n2 ln -s

Oder wenn/sourcedir Istdas aktuelle Verzeichnis:

find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
  xargs -r0n2 ln -s

Antwort3

finddruckt Namen relativ zu den Pfaden, die Sie als Argumente angeben. In diesem Fall ist der Pfad ., daher beginnen alle Namen mit ./. Um absolute Pfade zu erhalten, müssen Sie einen absoluten Pfad als Eingabe angeben:

find "$PWD" -type l -name '*.h'

Dieser Befehl verwendet die $PWDUmgebungsvariable, die den absoluten Pfad des aktuellen Arbeitsverzeichnisses enthält, sodass die Bedeutung Ihres ursprünglichen Befehls erhalten bleiben sollte.

Antwort4

find . -type l -name '*.h' -print0 | cut -z -c3- \
    | xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'

man find

  • -print0Drucken Sie den vollständigen Dateinamen gefolgt von einem null Zeichen auf der Standardausgabe.

man cut- Abschnitte aus jeder Dateizeile entfernen

  • -zZeilentrennzeichen ist NUL, nicht Newline.
  • -cWählen Sie nur diese Zeichen aus.
  • N-vom N-ten Byte, Zeichen oder Feld, gezählt von 1, bis zum Zeilenende.

man xargs- Befehlszeilen über die Standardeingabe erstellen und ausführen.

  • xargs [options] [command [initial-arguments]]
  • -0Eingabeelemente werden durch ein nullZeichen statt durch ein Leerzeichen beendet, und die Anführungszeichen und der Backslash sind nichts Besonderes (jedes Zeichen wird wörtlich genommen).
  • -I replace-str Ersetzen Sie Vorkommen von replace-strin initial-argumentsdurch Namen, die aus der Standardeingabe gelesen werden. Außerdem beenden nicht in Anführungszeichen gesetzte Leerzeichen keine Eingabeelemente; stattdessen ist das Trennzeichen das Zeilenumbruchzeichen. Impliziert -L 1.
  • -L max-linesmax-linesVerwenden Sie pro Befehlszeile höchstens nicht leere Eingabezeilen.

verwandte Informationen