Synology-Forum.nl
Tweaks / Addons A.K.A. The Underground => Optware / IPKG / Telnet => Topic gestart door: raptile op 28 mei 2012, 18:40:20
-
Ik heb op dit moment verschillende shares voor mijn video content.
(Voorbeeld)
/volume1/Series
/volume1/Movies
/volume1/Cabaret
Nu wil ik de content van alle drie deze shares/mappen laten zien in één map.
/volume1/video
Dit kan ik doen door in /volume1/video/ een shell script te plaatsen die softlinks maakt naar de mappen in die folders.
for file in ../Series/* ; do ln -s "$file" ; done
for file in ../Movies/* ; do ln -s "$file" ; done
for file in ../Cabaret/* ; do ln -s "$file" ; done
Hiermee zal alle content uit alle drie de folders zichtbaar zijn in /volume1/video/
Het nadeel hiervan is dat je dit script elke keer moet draaien indien de content in 1 van die drie folders is gewijzigd om de link te creeren.
Daarbij komend zou ik alle hardlinks eerst moeten verwijderen voordat het script nogmaals wordt gedraaid omdat er anders een hoop foutmeldingen komen met de melding dat de link al bestaat.
Of hier moet eerst een controle aan vooraf gaan of de hardlinks al bestaan of niet.
Nu heb ik twee vraagjes.
1 Kan dit ook op een andere/betere manier?
2 Indien deze er niet is, kan iemand mij vertellen hoe ik een controle uit moet voeren voor dit script? (Dus dat het commando "for file in ../Series/* ; do ln -s "$file" ; done" alleen wordt gedraaid indien de hardlink nog niet bestaat? (om zo vervuiling in de logging te voorkomen)
Alvast bedankt!
-
Waarom maak je deze 3 (voorbeeld) mappen niet gewoon aan in de map /volume1/video
Op deze manier dus:
/volume1/video/Series
/volume1/video/Movies
/volume1/video/Cabaret
Hoef je geen scripts te maken en je kunt ze nog gewoon via de share bereiken.
-
Waarom maak je deze 3 (voorbeeld) mappen niet gewoon aan in de map /volume1/video
Op deze manier dus:
/volume1/video/Series
/volume1/video/Movies
/volume1/video/Cabaret
Hoef je geen scripts te maken en je kunt ze nog gewoon via de share bereiken.
Het was slechts een voorbeeld.
Als je alles in /volume1/video/ plaatst kan iedereen er bij.
Maar ik wil dat klaasje wel bij /volume1/Series mag komen maar niet bij /volume1/Movies of /volume1/camera_films_van_de_kinderen
En Pietje mag wel bij /volume1/camera_films_van_de_kinderen maar niet bij /volume1/Series en /volume1/Movies
Helaas kun je de rechten per user slechts instellen op Share niveau in user/group management.
Daarnaast hoeven anderen niet te weten wat ik allemaal wel of niet onder /volume1/video heb staan.
En ik... ik wil graag overal bij kunnen.
en dat kan ook, maar nu moet ik elke keer handmatig de share opgeven.
Ik doe dat liever door een share voor mezelf aan te maken die alle folders in 1 keer laat zien in 1 overzicht.
Het heeft dus puur met gemak en privacy temaken.
-
Opgelost
#!/opt/bin/bash
#Verander de field seperator voor de for loop
IFS="
"
# de source directories even defineren.
DIRTOSCAN="/volume1/Series /volume1/Movies /volume1/Cabaret"
# Ga naar de target Directory
DESTDIR="/volume1/video"
#Loop door de sources directories.
for i in $DIRTOSCAN ; do
#Loop door de gevonden files in 1 van de source directories en delete regel 1 van de output
for file in `find $i -maxdepth 1 | sed '1d' ` ; do
#strip het pad zodat er alleen een bestandsnaam overblijft
file1=`echo $file | sed 's!.*/!!'`
# als een symlink van het bestand nog NIET bestaat (-h = symlink)
if [ ! -h `echo ${DESTDIR}/${file1}` ] ; then
# Maak de symlink
ln -s ${file} ${DESTDIR}
echo --- SYMLINK CREATED --- ${DESTDIR}/${file1}
fi
# Sluit beide loops.
done
done
Alle Mappen zullen nu te zien zijn in /volume1/video
NOTE:
Mocht je dit script gaan gebruiken dien je in /usr/syno/etc/smb.conf onder [Global] de volgende waarden toe te voegen:
follow symlinks = yes
wide symlinks = yes
unix extensions = no
-
Symlinks hoeven niet perse naar een bestand te verwijzen, maar mogen ook naar een folder linken.
Had je dus niet simpeler in /volume1/video (totaal slechts 3) symlinks kunnen plaatsen naar
de shares /volume1/Series, /volume1/Movies en /volume1/Cabaret?
Voor die drie shares kan je dan nog steeds de gewenste bevoegdheden individueel instellen.
Uiteraard moet je de genoemde wijzigingen in /usr/syno/etc/smb.conf nog steeds doorvoeren.
Plerry
-
Symlinks hoeven niet perse naar een bestand te verwijzen, maar mogen ook naar een folder linken.
Ik vond genoemde oplossing ook al erg complex en zou het zelf ook met symlinks oplossen.
-
Symlinks hoeven niet perse naar een bestand te verwijzen, maar mogen ook naar een folder linken.
Had je dus niet simpeler in /volume1/video (totaal slechts 3) symlinks kunnen plaatsen naar
de shares /volume1/Series, /volume1/Movies en /volume1/Cabaret?
Voor die drie shares kan je dan nog steeds de gewenste bevoegdheden individueel instellen.
Uiteraard moet je de genoemde wijzigingen in /usr/syno/etc/smb.conf nog steeds doorvoeren.
Plerry
Klopt, je kunt er voor kiezen om symlinks te maken naar alle drie deze shares.
Ik heb echter twee folders waar series in terecht komen.
Degene die sickbeard pakt en degene die ik zelf download op de pc en in een andere dir plaats.
Ok dit kan ik oplosen door zelf de bestanden gelijk in dezelfde dir te plaatsen.
Maar er zijn ook mensen die films naar mij uploaden in hun eigen folder op een share.
Als ik dan voor jou optie kies kom ik op 1 shared folder met daarin "video", "video jan", "video karel"etc.
En om dit op te lossen pak ik alle bestanden in elke folder en toon deze in 1 share.
Symlinks hoeven niet perse naar een bestand te verwijzen, maar mogen ook naar een folder linken.
Ik vond genoemde oplossing ook al erg complex en zou het zelf ook met symlinks oplossen.
Daarom heb ik ook een script gemaakt om het mezelf makkelijker temaken.
heb hem nog iets verfijnd.
Alser een film of serie bij komt, wordt er automatisch een symlink aangemaakt.
Wordt de oorspronkelijke folder echter verwijderd wijst de symlink naar een folder die niet meer bestaat.
Het script kijkt nu naar broken links en verwijderd deze.
#!/opt/bin/bash
# Zorg dat de datum en tijd goed leesbaar zijn
DATE=`date +"%b %e %T "`
# print een melding naar het /var/log/symlinklog logbestand en toon de melding op het scherm dat het script is gestart
printf "e[37m${DATE}e[34m#------------------------- RUNNING /opt/home/series-symlink-script.sh -------------------------#ne[37m" >> /var/log/symlinklog
printf "e[37m${DATE}e[34m#------------------------- RUNNING /opt/home/series-symlink-script.sh -------------------------#ne[37m"
# Indien je de symlinks wilt verwijderen: find /volume1/video/Series/ -maxdepth 1 -type l -exec rm {} ;
# Verander de field seperator voor de for loop anders zal hij mappen met spaties in de naam per wordt afhandelen in plaats van de map in zijn geheel
IFS="
"
# de source directories even defineren.
DIRTOSCAN="/volume1/Downloads/funny /volume1/uploads/jan /volume1/uploads/karel"
# Ga naar de target Directory
DESTDIR="/volume1/video/Series"
# Controleer of alle symlinks nog valide zijn
find ${DESTDIR} | while read -r LINK; do
# Indien de symlink verwijst naar een folder die niet bestaat
if ! test -e "$LINK"; then
# verwijder deze dan
rm "$LINK"
# En toon dit in /var/log/symlinklog en op het scherm
filedirectory=$(dirname $LINK)
filename=`echo $LINK | sed 's!.*/!!'`
printf "e[37m${DATE} --- e[36mSYMLINK e[31mREMOVED e[37m--- ${filedirectory}/e[31m${filename}e[31mn" >> /var/log/symlinklog
printf "e[37m${DATE} --- e[36mSYMLINK e[31mREMOVED e[37m--- ${filedirectory}/e[31m${filename}e[31mn"
fi
done
# Loop door de sources directories.
for i in $DIRTOSCAN ; do
# Loop door de gevonden files in 1 van de source directories en delete regel 1 van de output
for file in `find $i -maxdepth 1 | sed '1d' ` ; do
# strip het pad zodat er alleen een bestandsnaam overblijft
file1=`echo $file | sed 's!.*/!!'`
# als een symlink van het bestand nog NIET bestaat (-h = symlink)
if [ ! -h `echo ${DESTDIR}/${file1}` ] ; then
# Maak de symlink
ln -s ${file} ${DESTDIR}
printf "e[37m${DATE}e[37m --- e[36mSYMLINK e[32mCREATED e[37m--- ${DESTDIR}/e[32m${file1}ne[37m" >> /var/log/symlinklog
printf "e[37m${DATE}e[37m --- e[36mSYMLINK e[32mCREATED e[37m--- ${DESTDIR}/e[32m${file1}n"
fi
# Sluit beide loops.
done
done
# Print een melding naar /var/log/symlinklog en naar het scherm dat script klaar is
printf "e[37m${DATE}e[34m#------------------------- END OF SCRIPT -------------------------#n" >> /var/log/symlinklog
printf "e[37m${DATE}e[34m#------------------------- END OF SCRIPT -------------------------#n"