[+] skrypt bash - stworzenie drzewa linków do drzewa plików

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
aksnet
Posty: 53
Rejestracja: 25 maja 2013, 13:44
Lokalizacja: ifb0

[+] skrypt bash - stworzenie drzewa linków do drzewa plików

Post autor: aksnet »

Witam

Mam w podany folder np. "/home/user". W tym folderze są pliki
(w różnych podfolderach, niektóre kilka podfolderów głębiej).

np.
/home/user/a/x.txt
/home/user/a/b/c/y.txt

Plików może być dużo i w różnych podfolderach, a więc skrypt powinien działać rekurencyjnie.

Potrzebuję skrypt który stworzy linki do tych plików w
innym podanym folderze np. "/home/test/links" tak aby
struktura katalogów została zachowana, a do każdego pliku pojawił się link:

/home/test/links/a/@x.txt
/home/test/links/a/b/c/@y.txt

gdzie @x.txt to link do pliku "/home/user/a/x.txt"

itp.

Jak się do tego zabrać?
Ostatnio zmieniony 16 sierpnia 2017, 17:15 przez aksnet, łącznie zmieniany 2 razy.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2302
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Re: skrypt bash - stworzenie drzewa linków do drzewa plików

Post autor: LordRuthwen »

Najpierw odtwórz drzewo katalogów a potem dla każdego pliku stwórz link - wszystko zrobisz za pomocą find
Awatar użytkownika
aksnet
Posty: 53
Rejestracja: 25 maja 2013, 13:44
Lokalizacja: ifb0

Re: skrypt bash - stworzenie drzewa linków do drzewa plików

Post autor: aksnet »

Stworzyłem coś takiego:

Kod: Zaznacz cały

#!/bin/bash

$LINKSDIR="/home/user"
cd $LINKSDIR

files=`find -type f`
for file in $files
do
    FILE=${file:2} # usuwamy ze sciezki 2 poczatkowe znaki "./"    
     ln -s   $LINKSDIR/$FILE  ../../$FILE
done
linki są tworzone tam gdzie trzeba, ale nie wskazują jeszcze na to co trzeba

przed $LINKSDIR/$FILE potrzebuję wstawić " ../" tyle razy jaka jest głębokość folderu $FILE
(żeby się z niego wycofać) a następnie przejść do $LINKSDIR/$FILE

Może są jakieś prostsze metody?

PS.
Jak policzyć ile razy występuje znak "/" w stringu?
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2302
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Re: skrypt bash - stworzenie drzewa linków do drzewa plików

Post autor: LordRuthwen »

Masz przykład:

Kod: Zaznacz cały

#mam katalogi debian i debian2
# w katalogu debian tworzę drzewo katalogów 0/1/2/3/4/5/6/7/8/9, w każdym z nich znajdują się pliki a b c d e f g h i j k;
for i  in 0 1 2 3 4 5 6 7 8 9; do mkdir $i; cd $i; for j in a b c d e f g h i j k; do touch $j; done; done
#odwzorowuję drzewo katalogów z nadrzędnego debian do debian2:
cd debian
find . -type d -exec mkdir -p ../debian2/{} \;
#tworzę linki symboliczne dla każdego pliku do katalogu w debian2:
find . -type f -exec ln -s {} ../debian2/{} \;
#efekt:
debian $ ls -alR ../debian2/
../debian2/:
razem 12
drwxrwxr-x  3 lukasz lukasz 4096 sie 14 12:57 .
drwxr-xr-x 37 lukasz lukasz 4096 sie 14 12:55 ..
drwxrwxr-x  3 lukasz lukasz 4096 sie 14 13:00 0

../debian2/0:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 12:57 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 1
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 a -> ./0/a
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 b -> ./0/b
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 c -> ./0/c
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 d -> ./0/d
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 e -> ./0/e
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 f -> ./0/f
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 g -> ./0/g
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 h -> ./0/h
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 i -> ./0/i
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 j -> ./0/j
lrwxrwxrwx 1 lukasz lukasz    5 sie 14 13:00 k -> ./0/k

../debian2/0/1:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 2
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 a -> ./0/1/a
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 b -> ./0/1/b
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 c -> ./0/1/c
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 d -> ./0/1/d
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 e -> ./0/1/e
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 f -> ./0/1/f
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 g -> ./0/1/g
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 h -> ./0/1/h
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 i -> ./0/1/i
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 j -> ./0/1/j
lrwxrwxrwx 1 lukasz lukasz    7 sie 14 13:00 k -> ./0/1/k

../debian2/0/1/2:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 3
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 a -> ./0/1/2/a
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 b -> ./0/1/2/b
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 c -> ./0/1/2/c
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 d -> ./0/1/2/d
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 e -> ./0/1/2/e
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 f -> ./0/1/2/f
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 g -> ./0/1/2/g
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 h -> ./0/1/2/h
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 i -> ./0/1/2/i
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 j -> ./0/1/2/j
lrwxrwxrwx 1 lukasz lukasz    9 sie 14 13:00 k -> ./0/1/2/k

../debian2/0/1/2/3:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 4
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 a -> ./0/1/2/3/a
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 b -> ./0/1/2/3/b
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 c -> ./0/1/2/3/c
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 d -> ./0/1/2/3/d
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 e -> ./0/1/2/3/e
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 f -> ./0/1/2/3/f
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 g -> ./0/1/2/3/g
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 h -> ./0/1/2/3/h
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 i -> ./0/1/2/3/i
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 j -> ./0/1/2/3/j
lrwxrwxrwx 1 lukasz lukasz   11 sie 14 13:00 k -> ./0/1/2/3/k

../debian2/0/1/2/3/4:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 5
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 a -> ./0/1/2/3/4/a
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 b -> ./0/1/2/3/4/b
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 c -> ./0/1/2/3/4/c
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 d -> ./0/1/2/3/4/d
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 e -> ./0/1/2/3/4/e
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 f -> ./0/1/2/3/4/f
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 g -> ./0/1/2/3/4/g
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 h -> ./0/1/2/3/4/h
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 i -> ./0/1/2/3/4/i
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 j -> ./0/1/2/3/4/j
lrwxrwxrwx 1 lukasz lukasz   13 sie 14 13:00 k -> ./0/1/2/3/4/k

../debian2/0/1/2/3/4/5:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 6
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 a -> ./0/1/2/3/4/5/a
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 b -> ./0/1/2/3/4/5/b
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 c -> ./0/1/2/3/4/5/c
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 d -> ./0/1/2/3/4/5/d
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 e -> ./0/1/2/3/4/5/e
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 f -> ./0/1/2/3/4/5/f
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 g -> ./0/1/2/3/4/5/g
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 h -> ./0/1/2/3/4/5/h
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 i -> ./0/1/2/3/4/5/i
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 j -> ./0/1/2/3/4/5/j
lrwxrwxrwx 1 lukasz lukasz   15 sie 14 13:00 k -> ./0/1/2/3/4/5/k

../debian2/0/1/2/3/4/5/6:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 7
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 a -> ./0/1/2/3/4/5/6/a
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 b -> ./0/1/2/3/4/5/6/b
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 c -> ./0/1/2/3/4/5/6/c
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 d -> ./0/1/2/3/4/5/6/d
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 e -> ./0/1/2/3/4/5/6/e
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 f -> ./0/1/2/3/4/5/6/f
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 g -> ./0/1/2/3/4/5/6/g
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 h -> ./0/1/2/3/4/5/6/h
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 i -> ./0/1/2/3/4/5/6/i
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 j -> ./0/1/2/3/4/5/6/j
lrwxrwxrwx 1 lukasz lukasz   17 sie 14 13:00 k -> ./0/1/2/3/4/5/6/k

../debian2/0/1/2/3/4/5/6/7:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 8
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 a -> ./0/1/2/3/4/5/6/7/a
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 b -> ./0/1/2/3/4/5/6/7/b
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 c -> ./0/1/2/3/4/5/6/7/c
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 d -> ./0/1/2/3/4/5/6/7/d
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 e -> ./0/1/2/3/4/5/6/7/e
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 f -> ./0/1/2/3/4/5/6/7/f
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 g -> ./0/1/2/3/4/5/6/7/g
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 h -> ./0/1/2/3/4/5/6/7/h
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 i -> ./0/1/2/3/4/5/6/7/i
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 j -> ./0/1/2/3/4/5/6/7/j
lrwxrwxrwx 1 lukasz lukasz   19 sie 14 13:00 k -> ./0/1/2/3/4/5/6/7/k

../debian2/0/1/2/3/4/5/6/7/8:
razem 12
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
drwxrwxr-x 2 lukasz lukasz 4096 sie 14 13:00 9
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 a -> ./0/1/2/3/4/5/6/7/8/a
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 b -> ./0/1/2/3/4/5/6/7/8/b
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 c -> ./0/1/2/3/4/5/6/7/8/c
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 d -> ./0/1/2/3/4/5/6/7/8/d
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 e -> ./0/1/2/3/4/5/6/7/8/e
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 f -> ./0/1/2/3/4/5/6/7/8/f
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 g -> ./0/1/2/3/4/5/6/7/8/g
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 h -> ./0/1/2/3/4/5/6/7/8/h
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 i -> ./0/1/2/3/4/5/6/7/8/i
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 j -> ./0/1/2/3/4/5/6/7/8/j
lrwxrwxrwx 1 lukasz lukasz   21 sie 14 13:00 k -> ./0/1/2/3/4/5/6/7/8/k

../debian2/0/1/2/3/4/5/6/7/8/9:
razem 8
drwxrwxr-x 2 lukasz lukasz 4096 sie 14 13:00 .
drwxrwxr-x 3 lukasz lukasz 4096 sie 14 13:00 ..
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 a -> ./0/1/2/3/4/5/6/7/8/9/a
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 b -> ./0/1/2/3/4/5/6/7/8/9/b
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 c -> ./0/1/2/3/4/5/6/7/8/9/c
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 d -> ./0/1/2/3/4/5/6/7/8/9/d
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 e -> ./0/1/2/3/4/5/6/7/8/9/e
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 f -> ./0/1/2/3/4/5/6/7/8/9/f
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 g -> ./0/1/2/3/4/5/6/7/8/9/g
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 h -> ./0/1/2/3/4/5/6/7/8/9/h
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 i -> ./0/1/2/3/4/5/6/7/8/9/i
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 j -> ./0/1/2/3/4/5/6/7/8/9/j
lrwxrwxrwx 1 lukasz lukasz   23 sie 14 13:00 k -> ./0/1/2/3/4/5/6/7/8/9/k
Awatar użytkownika
aksnet
Posty: 53
Rejestracja: 25 maja 2013, 13:44
Lokalizacja: ifb0

Re: skrypt bash - stworzenie drzewa linków do drzewa plików

Post autor: aksnet »

Dzieki
Awatar użytkownika
lizard
Beginner
Posty: 287
Rejestracja: 08 lutego 2016, 18:47

Re: skrypt bash - stworzenie drzewa linków do drzewa plików

Post autor: lizard »

LordRuthwen, bardzo fajne rozwiązanie, ale zamiast:

Kod: Zaznacz cały

find . -type f -exec ln -s {} ../debian2/{} \;
zastsować:

Kod: Zaznacz cały

find . ! -type d -exec ln -s {} ../debian2/{} \;
Zostaną uwzględnione nie tylko pliki, ale dowiązania, urządzenia i gniazda.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2302
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Re: skrypt bash - stworzenie drzewa linków do drzewa plików

Post autor: LordRuthwen »

Tyz prawda :)
Jednak chciał tylko dla plików ;)
@aksnet: jeśli to rozwiązuje temat to oznacz go jako rozwiązany zgodnie z regulaminem forum
Zablokowany