2009-08-06 22 views
19

Jaki jest najprostszy sposób na "skopiowanie" hierarchii katalogów w systemie Linux, aby utworzyć nową hierarchię katalogów, podczas gdy wszystkie "pliki" to tylko dowiązania symboliczne wskazujące na rzeczywiste pliki w hierarchii źródłowej?dowiązanie symboliczne do hierarchii katalogów

cp -s nie działa rekurencyjnie.

+0

Zobacz również http://unix.stackexchange.com/q/196537/10047. – user905686

Odpowiedz

1

Przeszukałem trochę i znalazłem polecenie o nazwie lns, dostępne od here.

+0

To narzędzie działa doskonale dla mnie. Dzięki za wskazanie tego! –

+0

Dlaczego polecasz narzędzie innej firmy, jeśli cp z niektórymi (2) rozwiązuje problem. Wydaje mi się to zagrożeniem dla bezpieczeństwa. – Nikodemus

+0

Ponieważ nie wiedziałem o opcji -s osiem lat temu, kiedy napisałem odpowiedź. Jeśli uważasz, że odpowiedź jest dobra/zła, możesz ją awansować/odrzucić. – JesperE

11

Zaczynając od góry oryginalnych & nowych katalogów, myślę, że ta para find(1) poleceń zrobi co trzeba:

find original -type d -exec mkdir new/{} \; 
find original -type f -exec ln -s {} new/{} \; 

Pierwsza instancja konfiguruje strukturę katalogów, stwierdzając jedynie katalogi w oryginalnym drzewem i odtworzenie ich w nowym drzewie. Drugi tworzy dowiązania symboliczne do oryginalnych plików w nowym drzewie.

+0

Działa to bardzo ładnie (jak napisano powyżej, cp -as lub -Rs nie będzie działać na Mac OS X). Dobrym pomysłem może być '(cd origParentDir; find origDir ...; find origDir ..)', aby uzyskać względną ścieżkę jako parametr zarówno dla mkdir, jak i ln -s. Użyj paranthezy, aby uruchomić '(' subshell') ', ponieważ uruchomienie cd w podpowłoce spowoduje tylko tymczasowe ustawienie CWD; CWD jest odtwarzane, gdy kończy się podpowłoki. Na przykład. jeśli klonujesz '/ src/binutils-2.24' do' $ {HOME}/source', nie chcesz tworzyć folderu '' src' '. –

+0

Nieparzyste, że 'ln' nie ma opcji rekursywnej ... jak' ln -s -R orig/dir dest/dir'. – jiggunjer

26

Właśnie wykonałem szybki test na pudełku linuxowym i cp -sR /orig /dest robi dokładnie to, co opisałeś: tworzy hierarchię katalogów z dowiązaniami symbolicznymi dla nie-katalogów z powrotem do oryginału.

+0

Działa tylko na pierwszym poziomie katalogu. Dla każdego pliku w podkatalogach otrzymuję "xyz-file: może tworzyć relatywne dowiązania symboliczne tylko w bieżącym katalogu". (W systemie Ubuntu 8.10, wersja cp 6.10) –

+24

Powodem, dla którego otrzymujesz "plik xyz: można utworzyć względne dowiązania symboliczne tylko w bieżącym katalogu", jest to, że dla katalogu źródłowego określono ścieżkę względną. Będzie działać tak, jak chcesz, jeśli podasz bezwzględną ścieżkę do źródła, na przykład: "cp -sR/root/absolute/path/name dest". – PonyEars

+3

Jeśli potrzebujesz/chcesz, aby wszystkie dowiązania symboliczne były względne, możesz użyć [dowiązania symboliczne] (http://www.linuxcommand.org/man_pages/symlinks8.html) w następujący sposób: 'cp -sR/orig/dest && dowiązania symboliczne - rc/dest' –

0

Wiem, że pytanie dotyczyło powłoki, ale ponieważ można wywoływać perla z powłoki, napisałem narzędzie do zrobienia czegoś bardzo podobnego do tego i posted it na perlmonks kilka lat temu. W moim przypadku, ogólnie chciałem, aby katalogi pozostały linkami, dopóki nie zdecyduję inaczej. Byłoby dość trywialną zmianą, aby zrobić to automatycznie i rekurencyjnie.

7

Istnieje również narzędzie "lndir" (z X), które robi coś takiego; Znalazłem to tutaj: Debian Bug report #301030: can we move lndir to coreutils or debianutils? i teraz z przyjemnością go używam.

+2

Miałem problem dokładnie jak oryginalny pytający, a po rozpoczęciu kodu skryptu powłoki, znalazłem tę odpowiedź i odkryłem, że lndir jest już zainstalowany. Działa dokładnie tak, jak tego potrzebuję. – shmuelp

13
cp -as /root/absolute/path/name dest_dir 

zrobi to, co chcesz. Zauważ, że nazwa źródła musi być ścieżką bezwzględną, nie może być względna. W przeciwnym razie pojawi się ten błąd: "xyz-file: może tworzyć względne dowiązania symboliczne tylko w bieżącym katalogu."

także uważać, co masz kopiowania: jeśli dest_dir już istnieje, trzeba zrobić coś takiego:

cp -as /root/absolute/path/name/* dest_dir/ 
cp -as /root/absolute/path/name/.* dest_dir/ 
1

Jeśli czujesz coraz ręce brudne Oto sztuczka to automatycznie utworzy folder docelowy, podfoldery i dowiązanie wszystkich plików rekursywnie.

W folderze gdzie znajdują się pliki, które chcesz podlinkowujemy i podfoldery są:

  1. tworzyć powłokę pliku.sh:

    nano shell.sh

  2. skopiować i wkleić ten czarodziej:

#!/bin/bash

export DESTINATION=/your/destination/folder/ 
export TARGET=/your/target/folder/ 

find . -type d -print0 | xargs -0 bash -c 'for DIR in "[email protected]"; 
do 
    echo "${DESTINATION}${DIR}" 
    mkdir -p "${DESTINATION}${DIR}"   
    done' - 


find . -type f -print0 | xargs -0 bash -c 'for file in "[email protected]"; 
do 
    ln -s "${TARGET}${file}" "${DESTINATION}${file}" 
    done' - 
  1. zapisać plik ctrl+O
  2. zamknąć plik ctrl+X
  3. Dodać wykonywalny skrypt chmod 777 shell.sh

  4. uruchomić skrypt ./shell.sh

okazji włamania!

Powiązane problemy