
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
find
druckt 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 $PWD
Umgebungsvariable, 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/{}'
-print0
Drucken Sie den vollständigen Dateinamen gefolgt von einemnull
Zeichen auf der Standardausgabe.
man cut
- Abschnitte aus jeder Dateizeile entfernen
-z
Zeilentrennzeichen istNUL
, nicht Newline.-c
Wä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]]
-0
Eingabeelemente werden durch einnull
Zeichen 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 vonreplace-str
ininitial-arguments
durch 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-lines
max-lines
Verwenden Sie pro Befehlszeile höchstens nicht leere Eingabezeilen.