Użyj `ln`, aby utworzyć brakujący katalog

10

Piszę więc małego menedżera pakietów, a problemem, na który natrafiłem, jest tworzenie dowiązań symbolicznych do plików.

Instaluje pakiet /usr/pkg/name-version, a następnie czyta plik, aby ustalić, jakie dowiązania symboliczne należy utworzyć. Używam lndo tworzenia linków i napotkałem problem podczas próby zainstalowania nagłówków Linux API. Muszę połączyć same pliki nagłówków, a nie foldery, które je zawierają (więc jeśli 2 pakiety muszą umieścić pliki w tym samym podkatalogu include, mogą to zrobić bez zepsucia jednego pakietu).

Ten problem rozwiązałem, ale lnpo prostu popełniam błąd, jeśli ścieżka jest niekompletna, co jest denerwujące, ponieważ te katalogi nie powinny istnieć, dopóki pakiet nie zostanie zainstalowany.

Czy istnieje flaga ln, która utworzy brakujące katalogi, czy też będę musiał użyć jakiegoś skomplikowanego skryptu bash?

Chris
źródło
1
Być może brakuje mi czegoś oczywistego, ale dlaczego nie używasz mkdir... tworzenia katalogów?
jw013
Możesz także sprawdzić lndir.
rano

Odpowiedzi:

3

Nie potrzebujesz zawiłego skryptu bash, ale prostego, jednowierszowego. mkdir --parentszajmie się wszystkim, ładnie nawet nie drukując błędu, jeśli struktura katalogów już istnieje.

Uważaj tylko na sposób, w jaki traktujesz te katalogi podczas usuwania, aby nie uszkodzić innych pakietów.

Ponadto, skoro to piszesz bash, możesz rzucić okiem na czary (bezwstydna wtyczka). Być może łatwiej byłoby to po prostu zmodyfikować, ponieważ jest ono dojrzałe i elastyczne.

lynxlynxlynx
źródło
Ups, zapomniałem wspomnieć, że piszę w c ++ i łączę bash z wywołaniami system (), ponieważ jest to łatwiejsze. Tak właśnie skończyłem, dzięki.
Chris
@Chris: system()nie jest łatwiejsze, bardzo trudno jest poprawnie uniknąć argumentów wiersza poleceń system(). Przynajmniej powinieneś użyć posix_spawn()lub fork()+exec*(), który akceptuje argumenty wiersza poleceń jako tablice.
Lie Ryan
4

Nie ma flagi, aby to zrobić ln. Tworzenie katalogów nie jest zadaniem.

mkdir -p foo/bar/quxstworzy foo, foo/bara foo/bar/quxw razie potrzeby. Więc mkdir -pnajpierw wzywaj wszystkie oprócz ostatniej ścieżki.

Wygląda na to, że wymyślasz na nowo koło Stow , prosty menedżer pakietów, który łączy hierarchie katalogów, tworząc katalogi na wymaganą głębokość z symbolicznymi linkami do komponentów różnych pakietów w środku. A może XStow , który jest jak Stow, ale ma więcej możliwości dostosowywania.

Gilles „SO- przestań być zły”
źródło
0

Może tarmoże pomóc w przygotowaniu pliku z linkami:

find . -type l > links.txt
tar cpf links.tar --files-from links.txt

Następnie w razie potrzeby utwórz linki:

tar xvf links.tar
Vladimir Botka
źródło