Symlinken Sie alle Dateien, aber kopieren Sie bestimmte Erweiterungen

Symlinken Sie alle Dateien, aber kopieren Sie bestimmte Erweiterungen

Ich frage mich, wie ich alle Dateien in einer Verzeichnisstruktur symbolisch verknüpfen und dann auch Dateien mit einer bestimmten Erweiterung in dieses Verzeichnis kopieren kann. Ich erstelle im Grunde alle symbolischen Verknüpfungen zwischen allen Dateien in /foo/a,b,c und /bar/a,b,c und kopiere dann bestimmte Dateien mit einer bestimmten Erweiterung.

Antwort1

Aus dem /bar-Verzeichnis, um alle symbolischen Links für alles außer diesen Erweiterungen zu erstellen.

find ../foo/ -type f ! -name '*.txt' ! -name '*.baz' -exec ln -s '{}' \;

Und dann zum Kopieren aller Erweiterungen größtenteils derselbe Befehl.

find ../foo/ -type f \( -name "*.txt" -o -name "*.baz" \) -exec cp '{}' ./ \;

Bearbeiten: Ganze Verzeichnisstruktur kopieren, einige Dateien symbolisch verknüpfen, andere kopieren. War mir zunächst nicht sicher, ob das mit einem einzigen Befehl möglich war, habe aber gerade ein paar andere praktische Tricks mit find gelernt.

find foo/ -type d -printf "mkdir -vp 'bar/%p'\n" -o -type f ! -name "*.txt" ! -name "*.baz" -printf "ln -vs '../%p' 'bar/%p'\n" -o -type f \( -name "*.txt" -o -name "*.baz" \) -printf "cp -v %p bar/%p\n" | sh
mv bar/foo/* bar/ && rm -R bar/foo/

Wichtig ist nur, dass Sie beim Erstellen des symbolischen Links den tatsächlichen Pfad angeben, den die Links zu foo/ nehmen. Mein Beispiel zeigt relative Links, wenn sie nebeneinander stehen (es könnten auch absolute symbolische Links erstellt werden).

verwandte Informationen