Find commando negeert symlinks niet

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Nightcrawler28
  • Registratie: Oktober 2000
  • Laatst online: 28-06 17:13
inleiding

Voor het bewaken van een terein gebruik ik het Opensource Linux bewakingsprogramma ZoneMinder 1.25. In combinatie met een kleine ITX-server pc en een capturecard neemt dit programma alle beelden op bij een "event". En je raad het al een event is bij een bewakingscamera meestal een beweging in het beeld :P Alle bewegingen worden met een JPEG bestand opgeslagen (5 per seconde).

Nu heeft dit programma een prima webinterface waar je alles terug kan kijken in zowel "video stream" als JPEG modus. Maar ik vindt het handig om na elke 24 uur een totaal bestand aan te maken van alle gebeurtenissen.

Daarvoor heb ik een script geschreven die alle JPEG bestanden per camera netjes in tijdsvolgorde zet en vervolgens er met memcoder een MPEG4 van bakt. Dit werkt allemaal prima op 1 bug na.

OS: Linux Ubuntu Server 11.04 server 32-bits

Vraag

Ik haal met een variabele de naam van de hoofd directory op (=camera) en daarna ga ik de events met het commando FIND in een tekstbestandje zetten.

Echter bij deze FIND actie krijg ik alle bestanden 2x aangeleverd. Dat komt omdat er in elke map ook een symlink verwijzing staat naar het onderliggende nivo. (deze symlink wordt door het programma aangemaakt als verwijzing naar het database ID van de Event). Nu wil ik deze symlink dus negeren en de FIND actie alleen de "harde" paden laten volgen.

FIND string:
code:
1
 find $eventsFolder${cameraList[$i]} -follow  -mtime -1 -name \*capture.jpg > /tmp/alarmvideos/${cameraList[$i]}-FLV.list


Je zou zeggen dat met de find optie -FOLLOW het zou moeten werken. Maar als die gebruik dan vindt het nog steeds de symlinks. Kan iemand zien wat ik nu fout doe ????

Voorbeeld van de directory
Afbeeldingslocatie: http://img412.imageshack.us/img412/9576/zmdir.th.jpg [/URL]




Voorbeeld output van de find actie:
/var/www/zm/events/Oprit/11/09/26/05/12/30/001-capture.jpg
/var/www/zm/events/Oprit/11/09/26/05/12/30/002-capture.jpg
/var/www/zm/events/Oprit/11/09/26/05/12/30/003-capture.jpg
/var/www/zm/events/Oprit/11/09/26/05/12/30/004-capture.jpg
/var/www/zm/events/Oprit/11/09/26/05/12/30/005-capture.jpg

/var/www/zm/events/Oprit/11/09/26/.680/001-capture.jpg
/var/www/zm/events/Oprit/11/09/26/.680/002-capture.jpg
/var/www/zm/events/Oprit/11/09/26/.680/003-capture.jpg
/var/www/zm/events/Oprit/11/09/26/.680/004-capture.jpg
/var/www/zm/events/Oprit/11/09/26/.680/005-capture.jpg


complete code van script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Enumerate existing ZoneMinder Monitors and order events
cameraList=(`ls /var/www/zm/events/ | grep '[a-zA-Z]'`)
cameraNum=${#cameraList[@]}
eventsFolder=/var/www/zm/events/
echo Number of detected ZoneMinder Monitors: ${#cameraList[@]}

# Start working through all detected ZoneMinder Monitors
 for (( i=0; i<${cameraNum}; i++ ));
 do
  echo Doing ZoneMinder Monitor: ${cameraList[$i]}

# Get a list of images for the last 24 hours from each of the detected ZoneMinder Monitors.
  find $eventsFolder${cameraList[$i]} -follow  -mtime -1 -name \*capture.jpg > /tmp/alarmvideos/${cameraList[$i]}-FLV.list

# Sort output file for a consistent movie
 sort /tmp/alarmvideos/${cameraList[$i]}-FLV.list -n -o /tmp/alarmvideos/${cameraList[$i]}-FLV-sorted.list

# Encode each 24hr events into a movie Mpeg4 (edit with&hight for your cam settings)
  mencoder mf://@/tmp/alarmvideos/${cameraList[$i]}-FLV-sorted.list  -mf w=320:h=240:fps=5:type=jpg -o /tmp/alarmvideos/${cameraList[$i]}_`date +%F`.flv  -of lavf -ovc lavc -oac lavc -lavcopts vcodec=flv:vbitrate=180:autoaspect:acodec=mp3:abitrate=56 -vf scale=480:360  


# Find avi's with actual events-move to new dir
 cd /tmp/alarmvideos
find *.flv -size +50k -exec mv {} /var/www/Bluemotic/videoflow/videos \;

# Cleanup temp files
rm -rf /tmp/alarmvideos/*FLV*.list
rm -rf /tmp/alarmvideos/*.flv


p.s. zie ook het zoneminder forum voor dit zelfde verhaal..

] systeem spec's


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Lees eens even de man page en gebruik -P.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Nightcrawler28
  • Registratie: Oktober 2000
  • Laatst online: 28-06 17:13
Ik ken de man page (http://linuxmanpages.com/man1/find.1.php) echt wel. maar daar wordt het bij mij er niet duidelijker van. heb ook type d "/."-prune geprobeerd maar dat deed ook niks.

en -P zoals jij voorstelt is geen geldige test of operator ....

] systeem spec's


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Let er op dat je die flags _voor_ je pad moet opgeven.

In dit geval zou je dus iets als dit moeten gebruiken:
find -L $eventsFolder${cameraList[$i]} -mtime -1 -name \*capture.jpg > /tmp/alarmvideos/${cameraList[$i]}-FLV.list


De "-follow" optie is deprecated

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Nightcrawler28
  • Registratie: Oktober 2000
  • Laatst online: 28-06 17:13
tnx wolfboy heb wat gespeeld met het voor het path opgeven en -L maar dat heeft het helaas nog niet opgelost.

] systeem spec's


Acties:
  • 0 Henk 'm!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 03-10 18:29

deadinspace

The what goes where now?

edit: dit is echt een onzin-post 8)7
Nightcrawler28 schreef op dinsdag 15 november 2011 @ 12:23:
Echter bij deze FIND actie krijg ik alle bestanden 2x aangeleverd. Dat komt omdat er in elke map ook een symlink verwijzing staat naar het onderliggende nivo. (deze symlink wordt door het programma aangemaakt als verwijzing naar het database ID van de Event). Nu wil ik deze symlink dus negeren en de FIND actie alleen de "harde" paden laten volgen.
Dat zou ik met find's -type test doen. Een symlink is een ander type dan een gewone file, dus daarmee kun je dat onderscheid maken.
H!GHGuY schreef op dinsdag 15 november 2011 @ 12:47:
Lees eens even de man page en gebruik -P.
-P slaat alleen op symlinks die je als argument opgeeft, niet op symlinks die find onderweg op het filesystem tegenkomt (net als de -H, -L en -follow opties overigens).

Acties:
  • 0 Henk 'm!

  • Nightcrawler28
  • Registratie: Oktober 2000
  • Laatst online: 28-06 17:13
Dat zou ik met find's -type test doen. Een symlink is een ander type dan een gewone file, dus daarmee kun je dat onderscheid maken.
nou als ik dit gebruik:
code:
1
   find   $eventsFolder${cameraList[$i]} -type f -mtime -1 -name \*capture.jpg > /tmp/alarmvideos/${cameraList[$i]}.list


Dus type l (volgens manpage is "type f" een regular file) selecteren dan blijft me output leeg...

[ Voor 0% gewijzigd door Nightcrawler28 op 15-11-2011 16:48 . Reden: correctie het is type f (van File) niet l van link. ]

] systeem spec's


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Weet niet welke manpage je er op nageslagen hebt, maar " f " is een regular file.

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Nightcrawler28
  • Registratie: Oktober 2000
  • Laatst online: 28-06 17:13
Dat heb je correct afraca, het is type f niet l. maar daar zit toch het probleem denk ik niet.
de symlinks zijn directory links en niet links naar bestanden. de bestanden staan op het laagste nivo waar de symlink direct naar verwijst.

En voor iemand denkt waarom draai je het niet en volg je alleen de symlink. nou de mapstructuur die aangemaakt wordt door het programma is op tijdsnotatie. voor YYYY,MM,DD HH:MM:SS elk deel apart een mapje.

ik moet er dus voor zorgen dat die symlinks /.680/ zoals in het voorbeeld NIET worden gevolgd maar de "echte' directory mappen wel.

] systeem spec's


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

deadinspace schreef op dinsdag 15 november 2011 @ 15:20:
-P slaat alleen op symlinks die je als argument opgeeft, niet op symlinks die find onderweg op het filesystem tegenkomt (net als de -H, -L en -follow opties overigens).
Nee hoor, die werken op alles wat je tegenkomt.

De -P optie is standaard, dus standaard worden symlinks helemaal niet gevolgt:
find -P $eventsFolder${cameraList[$i]} -type f -mtime -1 -name \*capture.jpg
zou in alle gevallen moeten werken.

Waarschijnlijk gebruikte tijdens het testen -type in combinatie met -L of -follow, wat niet goed gaat als je het over symlinks hebt (daarvoor is -xtype).

Acties:
  • 0 Henk 'm!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 03-10 18:29

deadinspace

The what goes where now?

Nightcrawler28 schreef op dinsdag 15 november 2011 @ 16:47:
de symlinks zijn directory links en niet links naar bestanden. de bestanden staan op het laagste nivo waar de symlink direct naar verwijst.
Ah ok, ik had begrepen dat het ging om het negeren van symlinks naar bestanden, daar was mijn oplossing voor bedoeld. Eigenlijk had ik je startpost (en dan met name je voorbeeld) gewoon niet goed gelezen.

Maar ik heb nog eens goed gekeken, en volgensmij zou je originele find-opdracht zonder -follow eigenlijk moeten werken. Ik heb je voorbeeldstructuur hier ook even nagemaakt, en dan werkt jouw find-opdracht zonder -follow:
% tree -a Oprit                   
Oprit
`-- 11
    `-- 09
        `-- 26
            |-- 05
            |   `-- 12
            |       `-- 30
            |           |-- 001-capture.jpg
            |           |-- 002-capture.jpg
            |           |-- 003-capture.jpg
            |           |-- 004-capture.jpg
            |           `-- 005-capture.jpg
            `-- .680 -> 05/12/30
% find Oprit -name '*-capture.jpg'
Oprit/11/09/26/05/12/30/001-capture.jpg
Oprit/11/09/26/05/12/30/002-capture.jpg
Oprit/11/09/26/05/12/30/004-capture.jpg
Oprit/11/09/26/05/12/30/005-capture.jpg
Oprit/11/09/26/05/12/30/003-capture.jpg
%

Ik neem daarbij trouwens wel aan dat .680 dan een symlink is naar 05/12/30/.
Tim schreef op dinsdag 15 november 2011 @ 17:16:
[...]
Nee hoor, die werken op alles wat je tegenkomt.
Eh ja, je hebt volkomen gelijk.

Ik had ook de find manpage niet goed gelezen (met name: te vlug conclusies getrokken op basis van de inleiding van de OPTIONS stanza). Ik was wel lekker bezig zeg :P

Acties:
  • 0 Henk 'm!

  • Nightcrawler28
  • Registratie: Oktober 2000
  • Laatst online: 28-06 17:13
hey heel fijn dat jullie er nog eens naar hebben gekeken! _/-\o_
@Deathinspace je opbouw van de tree klopt helemaal, de symlinks staan op dag nivo.

En als ik naar de directory n 11/09/26 navigeer en daar find -name '*-capture.jpg' uitvoer komt er netjes ook de juiste lijst naar voren zonder dubbeltelling door de symlinks van directories!

Maar wanneer ik het in het script aanpas:
  find   $eventsFolder${cameraList[$i]}  -mtime -1 -name \*capture.jpg > /tmp/alarmvideos/${cameraList[$i]}.list 

Krijg ik een totaal lege uitput, erg vreemd! Kijk die -mtime -1 is gewoon een tijdsrange, en daar aan het eind staat dat die het naar een bestand moet schrijven per camera (/tmp/alarmvideos/${cameraList[$i]}.list). Die zijn ook niet van invloed.

Nu geloof ik jullie helemaal. Dus het was tijd om het script eens af te debuggen.
Beginnende bij hoe het script de camera's opzoekt. Dat doe ik met dit stukje code:
code:
1
2
3
4
cameraList=(`ls /var/www/zm/events/ | grep '[a-zA-Z]'`)
cameraNum=${#cameraList[@]}
eventsFolder=/var/www/zm/events/
echo Number of detected ZoneMinder Monitors: ${#cameraList[@]}


En daar gaat het fout! want in de eerste map EVENTS (/var/www/zm/events/)
staan 4 items.
cd /var/www/zm/events/
--1
--4
--Deur
--Oprit


De mappen 1 en 4 zijn de hardlinks waar achter alle events staan, deze nummers staan gewoon voor het nummer dat ik de camera geef. Dus 1 = Deur en 4 = Oprit.
Daaronder staan dus 2 directory symlinks "Deur" en "Oprit".

Doordat ik in mijn selectie code
`ls /var/www/zm/events/ | grep '[a-zA-Z]'`

GREP gebruik en die alleen naar letters kijkt (a-z) geeft het script als output Deur en Oprit.
En ja dat is niet handig want dat zijn nou juist de symlinks! Ouick fix is simpel. de grep aanpassen naar nummeric.
`ls /var/www/zm/events/ | grep '[0-9]'`


gedraaid en jawel het werkt!!

nu voor de netheid nog ff iets verzinnen dat de camera namen worden gebruikt in het output bestand maar dat is detail en niet het probleem wat ik hier aankaarte. opgelost door een extra variabele te maken voor camera naam en die in de output naamgeving te stoppen.

tnx guys voor het op het juiste spoor zetten }:O

] systeem spec's

Pagina: 1