[linux bash script] Symlinks maken

Pagina: 1
Acties:
  • 337 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

  • Toiletman
  • Registratie: Februari 2000
  • Laatst online: 28-08 19:36
Na een dat prutsen moet ik dan toch maar de hulp van GoT inroepen. Allereerst maar even het probleem.
Ik heb een linux server waar twee harde schijven inzitten... deze server wordt vooral gebruikt voor het opslaan van films. Nu zit een schijf vol, maar hier staan wel iets van 30 films op. Nieuwe films komen nu op de andere harde schijf terecht.
Om nu makkelijk te kunnen zien welke films ik al heb wil ik symlinks maken op de schijf die niet vol is, naar de filmdirectories op de volle schijf.
Nu zou dit een stukje taart moeten zijn om te maken:
1. Lees de directory namen op de volle schijf in de movies dir
2. ( Kijk of er dode links zijn / nieuwe films zijn bijgekomen )
3. Maak naar iedere directory een link in de movies dir op de lege schijf

Op zich moet dit zo in elkaar te zetten zijn, maar aangezien ik een enorme noob ben op linux gebied zit ik al de hele dag te prutsen. Het probleem zat eerst bij het uitlezen van maar één regel uit een heleboel regels, dit kan ik inmiddels via de commandline mbv sed. Nu wil sed dit echter niet doen in een scriptje, omdat ik daar een $COUNTER tussen ''s heb staan. Ik zal de code even posten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
SRCD="/shares/Shares/Video" #de dir die de links levert
TGTD="/home/----/scripttest" #de dir waar de links moeten komen te staan
COUNTER=$(ls $SRCD | wc -l) #het aantal regels = subdirs in de sourcedir
until [  $COUNTER -lt 1 ]; do
        #echo COUNTER $COUNTER
        let COUNTER-=1
done #jah het was een heel gekloot om die stomme loop werkend te krijgen
BLAAT=4
find $SRCD -maxdepth 1 -mindepth 1 -type d | sed -n '$BLAAT p' # $BLAAT wordt niet vertaald
in een getal
exit

Hieronder nog even m'n 1e filetje, dat staat vol met zooi, en nuttige commando's, maar die execute dus niet. Misschien leuk om te zien of ik op de goede weg ben?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
SRCD="/shares/Shares/Video"
#TGTD="/data/Shares/Video/"
TGTD="/home/----/scripttest/"
function maaklink {
        ln -s -f $1 $TGTD$2
}
#maaklink $SRCD link
#LINES = $(find $TGTD  -maxdepth 1 -mindepth 1 -type d)  #| wc -l) waarom werkt dit niet?
#echo $LINES
DIRECTORY=""
#COUNTER= ls $SRCD |wc -l dit werkte niet vanwege de spatie :-S
COUNTER=10
until [ $COUNTER==1 ]; do #== kentie niet?
        echo COUNTER $COUNTER
#       DIRECTORY ='for word in 'find $TGTD -maxdepth 1 -mindepth 1 -type d | sed -n '$COUNTER p'' ; do
# bovenstaande klopt nog geen hout van
#       done'
#       echo DIRECTORY: $DIRECTORY
        let COUNTER-=1
#       DIRECTORY=""
done
exit


Nou jah, jullie zien wel dat ik nogal chaotisch aan het werk ben (was) en dat het niet gaat werken. Ik ga er morgen weer mee verder, dus aub geen kant en klaar oplossingen aanleveren (in ieder geval niet zonder SPOILER). Wat ik wel graag zou willen weten is hoe ik de variabele BLAAT zo ver krijg dattie een getal wordt in onderstaande(dat doet hij nu niet omdat hij tussen 's staat, maar zonder die 's doet sed het niet:
code:
1
find $SRCD -maxdepth 1 -mindepth 1 -type d | sed -n '$BLAAT p'

Als ik de boel aan de praat heb zal ik het werkende script wel posten.

[ Voor 5% gewijzigd door Toiletman op 10-08-2004 00:56 ]

Only dead fish go with the flow


Acties:
  • 0 Henk 'm!

Verwijderd

ik kan niet echt reageren hierop, omdat ik hierin niet ervaren ben, maar was er niet iets met [:space:] dat je een spatie neer kon zetten?!

met het programma'tje tree kun je een mooi boom structuurtje krijgen van die map..., deze ff ontleden en dan er symlinks van maken?! (weet niet hoe het onder bash precies gescript kan worden) (heb het ooit met turbo pascal geschreven)

en is het niet een idee om de volle schijf op de lege schijf te mounten?

Acties:
  • 0 Henk 'm!

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Toiletman schreef op 10 augustus 2004 @ 00:49:
Wat ik wel graag zou willen weten is hoe ik de variabele BLAAT zo ver krijg dattie een getal wordt in onderstaande(dat doet hij nu niet omdat hij tussen 's staat, maar zonder die 's doet sed het niet:
code:
1
find $SRCD -maxdepth 1 -mindepth 1 -type d | sed -n '$BLAAT p'
Als je ""s gebruikt in plaats van ''s dan werkt het wel. Dus:
code:
1
find $SRCD -maxdepth 1 -mindepth 1 -type d | sed -n "$BLAAT p"

Alles wat tussen ''s staat wordt door bash letterlijk overgenomen.

--- edit
Hier staat mijn oplossing in Ruby.

[ Voor 16% gewijzigd door _Squatt_ op 10-08-2004 04:04 ]

"He took a duck in the face at two hundred and fifty knots."


Acties:
  • 0 Henk 'm!

  • Toiletman
  • Registratie: Februari 2000
  • Laatst online: 28-08 19:36
zal je altijd zien dat ik zoiets weer over het hoofd zie 's avonds laat...
thanks squatt!
Ik had al zitten prutsen met $( ) [] ' ' en dan vergeet ik ""
aiaiai, nou jah, dan denk ik dat ik dat scriptje morgen zo in mekaar kan tikken.

Only dead fish go with the flow


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Tussen single quotes doet bash niets. '$BLA' wordt letterlijk als $BLA doorgegeven. Zonder quotes of met double quites ('"') doet bash er wel wat mee. "$BLA" wordt ge-expand tot de waarde van $BLA.

edit:

Hmm, te laat zie ik. Damn.

[ Voor 20% gewijzigd door CyBeR op 10-08-2004 01:10 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 15:08

Kees

Serveradmin / BOFH / DoC
Bedenk wel dat windows met geen mogelijkheid de links kan zien, zodat je dus niet weet op welke share de dir staat. Daardoor zou je eigenlijk een film op beide shares moeten verwijderen.
Dit natuurlijk als er windows machines in het netwerk staan ;)

Verder, gebruik zoveel mogelijk "" zoals hierboven al gezegt wordt, en probeer al je variablen te voorzien van ${VAR}, dit is niet noodzakelijk, maar je voorkomt er wel domme dingen mee ;)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 15:08

Kees

Serveradmin / BOFH / DoC
Toch nog een spoiler, was zelf wel nieuwsgierig hoe je dit moest doen ;)

Spoiler om dode symlinks te verwijderen:
DIR="/home/bla"
rm `find ${DIR} -maxdepth 1 -type l -print0 | xargs -r0 file | grep "broken symbolic" | cut -d":" -f1`

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Kees schreef op 10 augustus 2004 @ 12:50:
Spoiler om dode symlinks te verwijderen: [knip]
Die werkt alleen niet voor symlinks met spaties.


find ${DIR} -maxdepth 1 -type l -print0 | xargs -r0 sh -c 'file "$0" | grep "broken symbolic" >/dev/null && rm "$0"'

Deze werkt wel voor symlinks met spaties, maar is weer erg lelijk omdat het voor elke link sh runt...

[ Voor 43% gewijzigd door _Squatt_ op 10-08-2004 13:21 ]

"He took a duck in the face at two hundred and fifty knots."


Acties:
  • 0 Henk 'm!

  • ajvdvegt
  • Registratie: Maart 2000
  • Laatst online: 13-08 16:01
_Squatt_ schreef op 10 augustus 2004 @ 13:07:
[...]

Die werkt alleen voor symlinks met spaties.
Hier werkt het ook voor symlinks zonder spaties hoor (ik zie ook niets dat op spaties controleert, en xargs gaaft het juiste argument aan file door). Het gaat alleen mis als je een werkende symlink hebt die 'broken symbolic' heet :).

[ Voor 12% gewijzigd door ajvdvegt op 10-08-2004 13:25 ]

I don't kill flies, but I like to mess with their minds. I hold them above globes. They freak out and yell "Whooa, I'm *way* too high." -- Bruce Baum


Acties:
  • 0 Henk 'm!

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
ajvdvegt schreef op 10 augustus 2004 @ 13:24:
Hier werkt het ook voor symlinks zonder spaties hoor (ik zie ook niets dat op spaties controleert, en xargs gaaft het juiste argument aan file door). Het gaat alleen mis als je een werkende symlink hebt die 'broken symbolic' heet :).
Klopt, ik was het woordje 'niet' vergeten :) En ik had nog helemaal niet gedacht aan een symlink met de naam 'broken symlink'!

Ik hou het wel bij mijn scriptje, dan maar geen one-liner :)

"He took a duck in the face at two hundred and fifty knots."


Acties:
  • 0 Henk 'm!

  • Zwerver
  • Registratie: Februari 2001
  • Niet online
Mjah, erg leuk natuurlijk, maar we doen in NOS niet aan scriptrequest. Lees de BASH howto er eens op na op TLDP over hoe je dit het beste zou kunnen scripten

Woonachtig Down Under. Ik negeer je insults niet, maar tegen de tijd dat ik ze lees zijn ze meestal niet relevant meer

Pagina: 1

Dit topic is gesloten.