LINUX: Połącz wszystkie pliki z jednego do drugiego katalogu [zamknięte]

123

Chcę łącza ( ln -s) wszystkich plików znajdujących się /mnt/usr/lib/w/usr/lib/

Plików jest dużo, jak to zrobić szybko? :)

SharpC
źródło
Ile plików to „dużo” i jak szybko uważasz, że „szybko”?
Eric Smith
4
Jest to 50:50, niezależnie od tego, czy pasowałoby to „serverfault”, czy „superuser”, ale nie jest to programowanie, więc nie w przypadku przepełnienia stosu.
Marc Gravell

Odpowiedzi:

202
ln -s /mnt/usr/lib/* /usr/lib/

Myślę, że to należy do superużytkownika.

Tim Cooper
źródło
6
Nie obejmuje to ukrytych plików i łączy całe katalogi. Jeśli któryś z nich nie jest tym, czego chcesz, zobacz moją odpowiedź. W przeciwnym razie jest to najkrótsza droga.
Cascabel
Masz rację. Ale biblioteki zwykle nie są ukryte. W każdym razie dotfile jest bardziej przydatny.
1
czy będzie wskazywać na inny folder na stałe?
nmkyuppie
@YuPPie Myślę, że po prostu tworzy twarde łącze do każdego pliku w katalogu. (właśnie tego chciałem dzisiaj, więc +1: D)
Nazwa wyświetlana
2
@SargeBorsch Tworzy dowiązania symboliczne (dowiązania twarde są różne).
jsejcksn
90

GNU cpma opcję tworzenia dowiązań symbolicznych zamiast kopiowania.

cp -rs /mnt/usr/lib /usr/

Zauważ, że jest to rozszerzenie GNU, którego nie znaleziono w POSIXcp .

kawiarnia
źródło
4
Twój aktualny katalog powinien być / usr / zrobić dowiązanie symboliczne w ten sposób
Soul_man
@caf Jeśli miejscem docelowym jest istniejący folder, folder lib jest tworzony w folderze / usr /
Tamil Selvan C
2
Dobra odpowiedź. Może być również używany do tworzenia twardych dowiązań z opcją -l zamiast -s.
Faks
19
ln -s /mnt/usr/lib/* /usr/lib/
Michael Krelin - haker
źródło
15

Opublikowane rozwiązania nie będą łączyły żadnych ukrytych plików. Aby je uwzględnić, spróbuj tego:

cd /usr/lib
find /mnt/usr/lib -maxdepth 1 -print "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done

Jeśli chcesz rekurencyjnie tworzyć katalogi i tylko pliki z linkami (tak, że jeśli tworzysz plik w katalogu, tak naprawdę /usr/libnie jest /mnt/usr/lib), możesz to zrobić:

cd /usr/lib
find /mnt/usr/lib -mindepth 1 -depth -type d -printf "%P\n" | while read dir; do mkdir -p "$dir"; done
find /mnt/usr/lib -type f -printf "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done
Cascabel
źródło
2
Uważam, że powinno to również działać jako sposób na symbole wieloznaczne w ukrytych plikach, jeśli w bashu włączono rozszerzone globowanie. Dopasowuje wszystko zaczynające się od kropki, po której następuje coś innego niż nic lub inna kropka (tj. Wyklucza ./i ../):ln -s /mnt/usr/lib/.!(|.)* /usr/lib
Cascabel