Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Automatische bestandsverwijdering  (gelezen 1677 keer)

Offline 10o

  • Lid
  • Steunpunt: Nee
Automatische bestandsverwijdering
« Gepost op: 2013/02/27, 15:04:22 »
Is het mogelijk mijn Ubuntu Server zo in te stellen, dat  wanneer er een mkv-bestand verwijderd wordt, altijd automatisch ook het srt-bestand in dezelfde map met identieke naam mee verwijderd wordt?
Dan worden mijn video-mappen op de server mooi schoon gehouden als ik via mijn mediaplayer (NFS-connectie) iets verwijder. Ik weet; kleinigheidje, maar wel leuk als het kan en weet hoe zoiets kan...
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #1 Gepost op: 2013/02/27, 15:54:18 »
Een scriptje dat alle srt-bestanden verwijdert waar geen mkv-bestand met dezelfde naam meer naast staat zou ook OK zijn. Laat ik dat meedraaien met cron.
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #2 Gepost op: 2013/02/27, 17:08:08 »
Heb even een scriptje gemaakt. :)
#!/bin/bash
folder='/home/thomas/testfolder'
echo 'Waiting for mkv files to be deleted...'
inotifywait -mqr -e delete --format "%w%f:%e" "${folder}" |\
while read notifile; do
    echo
    echo "${notifile}"
    temp="${notifile%:*}"
    filefolder="${temp%/*}"
    filename="${temp##*/}"
    if [[ "${filename}" == *.mkv ]]; then
      srtfile="${filefolder}/${filename%.mkv}.srt"
      if [ -e $srtfile -a -w $srtfile ]; then                                                                                                       
        echo "Removing: ${srtfile}"
        rm "${srtfile}"
      else
        echo "No removable srt file was found."
      fi
    fi
done
exit 0

Het is wel nodig om inotify-tools te installeren wil het scriptje werken.
« Laatst bewerkt op: 2013/02/27, 17:52:31 door Thomas de Graaff »

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #3 Gepost op: 2013/02/27, 17:39:50 »
Hey Thomas, wat cool dat je zo snel meedenkt en met een inventief scriptje op de proppen komt!  :)
rm "${folder}/${filename%.mkv}.srt"Als ik het goed interpreteer werkt dit scriptje als een soort watchdog die permanent wacht op deletes van mkv-bestanden in een specifieke folder. Nu is het in mijn server-setup zo, dat bijvoorbeeld iedere tv-serie zijn eigen subfolder heeft in /mnt/disc2/videos/tv-series. Dat is niet alleen overzichtelijk, maar het sluit ook aan bij de werkwijze van Sickbeard. Is jouw script zo te tweaken dat meteen alle files in subfolders van de opgegeven folder meegenomen worden?

Verder vroeg ik me af waar de echo's blijven? De server is in feite headless. Ik benader 'm desnoods met SSH, maar verder zijn alle schijven gewoon gemount via de laptop. Af en toe sluit ik 'm wel 's aan op de TV via HDMI, als het op een andere manier niet meer lukt.
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #4 Gepost op: 2013/02/27, 17:48:08 »
Volgens mij kan het ook wat eenvoudiger als het niet direct hoeft te gebeuren (dat je bijvoorbeeld om het kwartier het scriptje laat draaien).

- Loop alle bestanden langs in bepaalde map (ook in submappen binnen die map)
- Is het een .srt bestand? kijk dan of er ook eem .mkv bestaat met dezelfde titel, zo nee: verwijderen.

Aangezien ik niet precies weet of dit is wat je wil heb ik het bij een omschrijving gehouden en geen code :P Maar de code hiervoor moet betrekkelijk simpel zijn.

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #5 Gepost op: 2013/02/27, 17:59:57 »
Als ik het goed interpreteer werkt dit scriptje als een soort watchdog die permanent wacht op deletes van mkv-bestanden in een specifieke folder. Nu is het in mijn server-setup zo, dat bijvoorbeeld iedere tv-serie zijn eigen subfolder heeft in /mnt/disc2/videos/tv-series.
Ik heb het script even aangepast, optie recursive toegevoegd aan het inotifywait commando (zie post met script), en een fout verbeterd.

Citaat
Verder vroeg ik me af waar de echo's blijven? De server is in feite headless. Ik benader 'm desnoods met SSH, maar verder zijn alle schijven gewoon gemount via de laptop. Af en toe sluit ik 'm wel 's aan op de TV via HDMI, als het op een andere manier niet meer lukt.
Waar de echo's blijven kan je zelf bepalen afhankelijk van hoe je het script start.

Bijvoorbeeld:
./srtdel.sh 1>/dev/null 2>&1
Op deze manier wordt alle output (normaal, en error) naar /dev/null gestuurd, waar het vervolgens verdwijnt. In plaats van naar /dev/null kan je het ook naar een log bestand sturen.
« Laatst bewerkt op: 2013/02/27, 18:06:05 door Thomas de Graaff »

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #6 Gepost op: 2013/02/27, 18:00:47 »
Hi erik1984. Dat is inderdaad wat ik bedoelde in mijn 2e comment. Of het eenvoudiger is, weet ik niet. Maar ik heb toch een cronjob die een paar keer per dag draait met daarin o.a. een script dat checkt of er ondertitels ontbreken en zo ja of die ergens op te halen zijn. Dat gaat via Subliminal.
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #7 Gepost op: 2013/02/27, 18:03:12 »
@Thomas: Enorm bedankt! Ik ga het uitzoeken en testen.
Ik neem aan dat het script maar eenmalig gestart hoeft te worden na boot?
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #8 Gepost op: 2013/02/27, 18:09:56 »
Volgens mij kan het ook wat eenvoudiger als het niet direct hoeft te gebeuren (dat je bijvoorbeeld om het kwartier het scriptje laat draaien).

- Loop alle bestanden langs in bepaalde map (ook in submappen binnen die map)
- Is het een .srt bestand? kijk dan of er ook eem .mkv bestaat met dezelfde titel, zo nee: verwijderen.

Aangezien ik niet precies weet of dit is wat je wil heb ik het bij een omschrijving gehouden en geen code :P Maar de code hiervoor moet betrekkelijk simpel zijn.

Dat is zeker een eenvoudiger script. Maar afhankelijk van de hoeveelheid bestanden kan het wellicht een aardige belasting voor de server opleveren om alle bestanden na te lopen. In de praktijk zal dat wel meevallen denk ik omdat het om films gaat. :)

Ik moet eerlijk bekennen dat ik voor de ingewikkelde oplossing vooral heb gekozen omdat ik eerder zoiets had gemaakt, en het leuk vond dat scriptje weer te hergebruiken. :)

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #9 Gepost op: 2013/02/27, 18:10:20 »
Ik neem aan dat het script maar eenmalig gestart hoeft te worden na boot?
Idd.

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #10 Gepost op: 2013/02/27, 20:05:52 »
Ben het aan het testen, maar nog zonder resultaat.

Gedaan:

sudo apt-get install inotify-tools
uitvoerbaar bestand autorm-srt.sh aangemaakt in ~
#!/bin/bash
folder='/mnt/hitachi2tb2/Videos/TV-Series'
inotifywait -mqr -e delete --format "%w%f:%e" "${folder}" |\
while read notifile; do
    temp="${notifile%:*}"
    filefolder="${temp%/*}"
    filename="${temp##*/}"
    if [[ "${filename}" == *.mkv ]]; then
      srtfile="${filefolder}/${filename%.mkv}.srt"
      if [ -e $srtfile -a -w $srtfile ]; then                                                                                                       
        rm "${srtfile}"
      fi
    fi
done
exit 0

script via laptop middels SSH op de server gestart:
sh autorm-srt.sh 1>/dev/null 2>&1SSH commandline is dan niet meer "beschikbaar" (totdat ik met crtl-C afbreek).

mkv-bestand verwijderen in  /mnt/hitachi2tb2/Videos/TV-Series of een subfolder ervan leidt (nog) niet tot het meeverwijderen van het gelijknamige srt-bestand.

Wat is er nog niet in den haak?
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #11 Gepost op: 2013/02/27, 20:48:57 »
Geen idee waarom het niet werkt. Ik heb het scriptje hier lokaal getest, en daar werkte het prima. Wellicht iets met permissies? Om te debuggen is het handig om wat echo's toe te voegen, en om die naar een log te laten schrijven.

Bijvoorbeeld:
#!/bin/bash
folder='/mnt/hitachi2tb2/Videos/TV-Series'
#!/bin/bash
folder='/home/thomas/testfolder'
echo 'Waiting for mkv files to be deleted...'
inotifywait -mqr -e delete --format "%w%f:%e" "${folder}" |\                                                                                       
while read notifile; do
  echo
  echo "${notifile}"
  temp="${notifile%:*}"
  filefolder="${temp%/*}"
  filename="${temp##*/}"
  if [[ "${filename}" == *.mkv ]]; then
    srtfile="${filefolder}/${filename%.mkv}.srt"
    echo "Looking for file to cleanup: $srtfile"
    if [ -e $srtfile ]; then
      echo "File found."
      if [ -w $srtfile ]; then
        echo "File removed."
        rm "${srtfile}"
      else 
        echo "File not writable, check permissions."
      fi
    else 
      echo "No file to cleanup was found."
    fi
  fi
done 
exit 0

Als je dit opstart met een log, dan kan je door de log te lezen wellicht meer info achterhalen:
sh autorm-srt.sh 1>/home/gebruikersnaam/testlog.log 2>&1
« Laatst bewerkt op: 2013/02/27, 22:57:07 door Thomas de Graaff »

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #12 Gepost op: 2013/02/27, 21:09:26 »
In eerste instantie stond er een uppercase letter in de folder-variabele waar een lowercase letter had moeten staan. In tweede instantie werkt het nog niet en zie ik dit in de log:

Waiting for mkv files to be deleted...
autorm-srt.sh: 4: autorm-srt.sh:  : not found

#!/bin/bash
folder='/mnt/hitachi2tb2/Videos/TV-series'
echo 'Waiting for mkv files to be deleted...'
inotifywait -mqr -e delete --format "%w%f:%e" "${folder}" |\                                                                                       
while read notifile; do
  echo
  echo "${notifile}"
  temp="${notifile%:*}"
  filefolder="${temp%/*}"
  filename="${temp##*/}"
  if [[ "${filename}" == *.mkv ]]; then
    srtfile="${filefolder}/${filename%.mkv}.srt"
    echo "Looking for file to cleanup: $srtfile"
    if [ -e $srtfile -a -w $srtfile ]; then                                                                                                               echo "File found."
      if [ -w $srtfile ]; then
        echo "File removed."
        rm "${srtfile}"
      else 
        echo "File not writable, check permissions."
      fi
    else 
      echo "No file to cleanup was found."
    fi
  fi
done 
exit 0

Ik zie in gedit dat de backslash aan het einde van regel 4 altijd een regel eronder komt te staan (maar niet op een volgend regelnummer)...

Ps. Ik verwijder het mkv-bestand in deze test via nautilus op de laptop (nfs-mount) of in een ander SSH-terminal venster...
« Laatst bewerkt op: 2013/02/27, 22:29:04 door 10o »
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #13 Gepost op: 2013/02/27, 22:55:12 »
Ik zou zo niet weten wat er mis gaat eerlijk gezegd.

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #14 Gepost op: 2013/02/28, 08:16:51 »
Zou het zo kunnen zijn dat het script alleen actief is in de (SSH) terminalsessie waarin het draait? Dat kan ik nl. niet testen, omdat de commandline niet "terugkomt" na starten van het bash script...
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #15 Gepost op: 2013/02/28, 12:28:48 »
Je kan twee ssh sessies openen. Via de ene start je het script op, en bekijk je de feedback van het script, en via de andere verwijder je het .mkv bestand, en kijk je of het overeenkomende .srt bestand verwijderd wordt.

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #16 Gepost op: 2013/02/28, 12:43:25 »
Voor wat het waard is heb ik toch maar het scriptje gemaakt om periodiek te zoeken naar .srt bestanden zonder .mkv. Dit is dus geen 'luisterend' script en Thomas heeft ook wel een goed punt over de efficiëntie. Je zou het eens kunnen proberen.

#!/bin/bash
for f in $(find /pad/naar/filmmap -name "*.srt")
do
        kaal=${f%.srt}
        mkv=$kaal".mkv"
        if [ ! -e $mkv ]
        then
                echo ".srt zonder .mkv gevonden: "$f
                rm $f
        fi
done
exit 0

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #17 Gepost op: 2013/02/28, 14:42:27 »
Je kan twee ssh sessies openen. Via de ene start je het script op, en bekijk je de feedback van het script, en via de andere verwijder je het .mkv bestand, en kijk je of het overeenkomende .srt bestand verwijderd wordt.
Yep, zo heb ik het ook getest. Via tweede SSH sessie en via Nautilus op de laptop. Alleen heb ik steeds de feedback naar een bestandje laten schrijven en dat na afloop gecheckt.
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #18 Gepost op: 2013/02/28, 15:00:33 »
Voor wat het waard is heb ik toch maar het scriptje gemaakt om periodiek te zoeken naar .srt bestanden zonder .mkv. Dit is dus geen 'luisterend' script en Thomas heeft ook wel een goed punt over de efficiëntie. Je zou het eens kunnen proberen.

Bedankt voor je bijdrage erik1984!
Jouw script werkt in één testfolder zonder "speciale" tekens in de foldernaam. Maar mijn verzameling bestaat uit tientallen subfolders, en het lijkt erop dat het misgaat zodra er een spatie in de mapnaam staat (en dat zijn er veel)... Daardoor wil het scriptje ook spul verwijderen dat niet verwijderd moet worden. Gelukkig lukt 'm dat niet! Zie hier een stukje output ter hoogte van het mapje "The Sopranos":

rm: kan ‘/mnt/hitachi2tb2/Videos/TV-series/The’ niet verwijderen: Bestand of map bestaat niet
removed .srt without .mkv: Sopranos/S6/The.Sopranos.S06E12.720p.HDDVD.x264-BLiND.srt
rm: kan ‘Sopranos/S6/The.Sopranos.S06E12.720p.HDDVD.x264-BLiND.srt’ niet verwijderen: Bestand of map bestaat niet
removed .srt without .mkv: /mnt/hitachi2tb2/Videos/TV-series/The
rm: kan ‘/mnt/hitachi2tb2/Videos/TV-series/The’ niet verwijderen: Bestand of map bestaat niet
removed .srt without .mkv: Sopranos/S6/The.Sopranos.S06E13.720p.HDDVD.x264-BLiND.srt

Mijn script:

#!/bin/bash
for f in $(find /mnt/hitachi2tb2/Videos/TV-series -name "*.srt")
do
        stripped=${f%.srt}
        mkv=$stripped".mkv"
        if [ ! -e $mkv ]
        then
                echo "removed .srt without .mkv: "$f
                rm $f
        fi
done
exit 0

De variabelen in het script kunnen blijkbaar niet hergebruikt worden zodra er een spatie in zit. Moet er ws. een backslash voor. Maar hoe? Onderstaande (met toevoeging van quotes om de variabelen) is 'm namelijk ook (nog) niet, want die splitst 'm op in meerdere variabelen (om de spaties heen)...

#!/bin/bash
for file in $(find /mnt/hitachi2tb2/Videos/TV-series -name "*.srt")
do
        stripped="${file%.srt}"
        mkv="$stripped"".mkv"
        if [ ! -e "$mkv" ]
        then
                echo "removed .srt without .mkv: ""$file"
                rm "$file"
        fi
done
exit 0

../Test 1/1.srt leidt dan tot:
removed .srt without .mkv: /mnt/hitachi2tb2/Videos/TV-series/test/Test
rm: kan ‘/mnt/hitachi2tb2/Videos/TV-series/test/Test’ niet verwijderen: Bestand of map bestaat niet
removed .srt without .mkv: 1/1.srt
rm: kan ‘1/1.srt’ niet verwijderen: Bestand of map bestaat niet
« Laatst bewerkt op: 2013/02/28, 15:53:14 door 10o »
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #19 Gepost op: 2013/02/28, 22:11:28 »
Het lijkt erop dat ik iets moet doen met quotes in regel 3 (for file...):
#!/bin/bash
folder='/mnt/hitachi2tb2/Videos/TV-series'
for file in $(find "$folder" -name "*.srt")
do
        stripped="${file%.srt}"
        mkv="$stripped"".mkv"
        if [ ! -e "$mkv" ]
        then
                echo "removed .srt without .mkv: ""$file"
                rm "$file"
        fi
done
exit 0

Echter
for file in "$(find "$folder" -name "*.srt")"voegt bestandsnamen samen in één variabele...
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #20 Gepost op: 2013/02/28, 22:48:56 »
Had vanmiddag nog even gezocht op het probleem van de spaties in mapnamen en kwam deze interessante link tegen: http://stackoverflow.com/questions/7039130/bash-iterate-over-list-of-files-with-spaces

De simpelste oplossing qua syntax die ik daar tegen kwam was de volgende:
find . -iname "foo*" | while read f
Regel 3 zou je dus kunnen veranderen in:
find "$folder" -name "*.srt" | while read fAls het goed is moet dan wel de spatie in de paden worden meegenomen.

Offline 10o

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #21 Gepost op: 2013/02/28, 23:01:43 »
Yeah, erik1984! Die doet 't.

Dit is het script geworden (rmsubs.sh):

#!/bin/bash
folder="/mnt/hitachi2tb2/Videos/TV-series"
find "$folder" -name "*.srt" | while read file
do
        stripped="${file%.srt}"
        mkv="$stripped"".mkv"
        if [ ! -e "$mkv" ]
        then
                echo "removed orphaned subtitle: ""$file"
                rm "$file"
        fi
done
exit 0

Eenmaal daags vóór het ontbijt, dus:

crontab -e00 07 * * * /home/10o/rmsubs.sh
Enorm bedankt voor de hulp Thomas en Erik!
Nu zoekt de server niet alleen "vanzelf" naar ontbrekende subs bij (automatisch gedownloade) TV-series, hij ruimt ze ook nog eens netjes op als een aflevering bekeken en verwijderd is via de media-streamer. Neat! :)
« Laatst bewerkt op: 2013/02/28, 23:22:52 door 10o »
Workstation:  i7-5820K 16GiB - GeForce GTX 960 2GiB - 4K  (Ubuntu 16.04.1)
Server: Asus E35M1-I Deluxe - AMD Fusion APU E-350 (Ubuntu Server 16.04.1)

Offline Thomas de Graaff

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #22 Gepost op: 2013/03/01, 00:14:51 »
Mooi. :)

Offline flyerman

  • Lid
  • Steunpunt: Nee
Re: Automatische bestandsverwijdering
« Reactie #23 Gepost op: 2013/03/08, 19:46:17 »
Het kan veel simpeler. Elke film krijgt zijn eigen folder met de naam van de film. Daarin staan de bestanden. Zowel mkv of wat dan ook en het srt bestand.

Wil je van de film af delete je de folder en voila alles weg. Geen scripts die de server onnodig belasten.
Server: Ubuntu 14.04 server edition
1 x Desktop: Mint 17.1
Netbook: Acer Aspire One Xubuntu 12.04.
Laptops: 1 x Asus Linux Mint 17.1, 1 x Acer XUbuntu 12.04