[Frage] - Cronjob-Befehle funktionieren nicht

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

Binomico

Benutzer
Registriert
01. Juni 2010
Beiträge
573
Reaktionspunkte
0
Punkte
42
Moin,

ich hab mir zum Ziel gesetzt definierte Dateitypen und Ordner zeitgesteuert löschen zu lassen. Leider funktioniert der von mir angestrebte Weg nicht ... nachfolgend mein erster Versuch, eingetragen in die crontab, die /usr/syno/etc/rc.d/S04crond.sh hab ich nach der Eintragung neu gestartet.


Rich (BBCode):
35      13       root    find ./volume1/Video/ -name '*.nfo' -exec rm '{}' \;
36      13       root    find ./volume1/Video/ -name '*.sfv' -exec rm '{}' \;
37      13       root    find ./volume1/Video/ -name '*.txt' -exec rm '{}' \;
38      13       root    find ./volume1/Video/ -name 'Sample' -exec rm -rf '{}' \;
39      13       root    find ./volume1/Video/ -name 'Subs' -exec rm -rf '{}' \;
* * * der Lesbarkeit wegen entfernt

Grüße
 
mal den kompletten Pfad zu find probiert? cron hat ein eigenes PATH-Enviroment, welche nicht identisch sein muss zu dem was du auf der Shell hast
 
Okay, gut zu wissen.

Hab in der Zwischenzeit mal nen anderen Ansatz probiert und eine removescript.sh erstellt
Rich (BBCode):
#!/bin/sh
#
find /volume1/Video/ -name '*.sfv' -exec rm '{}' \; 
find /volume1/Video/ -name '*.nfo' -exec rm '{}' \;
find /volume1/Video/ -name '*.txt' -exec rm '{}' \; 
find /volume1/Video/ -name 'Sample' -exec rm -rf '{}' \; 
find /volume1/Video/ -name 'Subs' -exec rm -rf '{}' \; 
# End

Das Ding funktioniert "sh removescript.sh", allerdings erhalte ich die Meldung "/volume1/Video/urlaubsvideokreta1/Sample: No such file or directory" der Ordner Sample wurde aber korrekt gelöscht. Ist ne reine Verständnisfrage :cool:

Edit: ich glaub, dass diese Meldung immer dann ausgegeben wird, wenn keine Datei in diesem Ordner liegt
 
Zuletzt bearbeitet:
Probier mal für Verzeichnisse

Rich (BBCode):
-type d

statt -name

Ber erstmal an einem sicheren Ort testen! Gerade rm -rf richtet ha böses an an falscher Stelle!

gruss
dude
 
Hey dude,

haut leider nicht hin "find: unrecognized: sample" gleiches für subs ... habs jetzt aber mehr oder weniger geschafft
Code:
#!/bin/sh
#
find /volume1/Video/ -name '*.sfv' -exec rm '{}' \; 
find /volume1/Video/ -name '*.nfo' -exec rm '{}' \;
find /volume1/Video/ -name '*.txt' -exec rm '{}' \; 
find /volume1/Video/ -iname 'sample' -exec rm -rf '{}' \; 
find /volume1/Video/ -iname 'subs' -exec rm -rf '{}' \; 
find /volume1/Video/ -iname '*imdb*' -exec rm -rf '{}' \; 
# End
Abgespeichert als removescript.sh im public und das ganze mit Pfadangabe in die crontab eingetragen >> funktioniert (und die Meldung bekomm ich - logisch - nicht angezeigt, denk mal, dass das zu vernachlässigen ist, oder?).

Beste Grüße
 
Ich häng gleich nochmal ne - zugegeben etwas kniffligere - Frage dran :-)

Ich würde gern automatisiert Dateien gezielt bereinigen, genauer im Dateinamen definierte Parameter entfernen.

Ein Beispiel: ich hab diverse Urlaubsfotos, die alle "-canon-" im Dateinamen haben, das sollte raus, der Rest des Namens soll wie vorhanden beibehalten werden.

Jetzt komm ich leider nicht mehr weiter, reicht hier ebenfalls ein find und rn oder brauch ich ein Bash-Script mit Regular Expressions?

Merci und Grüße
 
Das würde ich persönlich ned via Shell machen. Ist ziemlich fummelig. Würde ein PHP Script empfehlen. Oder gleich ein Tool das dir das vom PC aus erledigen kann. Gibt viele gute Rename-Tools, die auch mit Sambafreigaben (resp UNC-Pfaden) zurecht kommen
 
Jau, z.B. der Total Commander, so handhab ich das bis jetzt. Aber angetrieben durch vorangegangenes Erfolgserlebnis :D würd ich das schon gern automatisiert haben, da in unregelmäßigen Abständen auch immer wieder neue Dateien hinzukommen. Na ja ist halt die Last eines Perfektionisten ... *augenroll*

Vielleicht muss ich doch langsam mein ewiges Hassprojekt RegEx anpacken!

Grüßle
 
Natürlich geht es auch mit RegExp. Nur halte ich es immer so: Warum das Rad neuerfinden? http://www.advancedrenamer.com/ kannst du problemlos auch via Task-Manager automatisieren.
 
Sodele, hab was probiert

Code:
#!/bin/sh
${var#string}
for f in canon*; do mv "$f" "${f#canon-}"; done
for f in urlaub*; do mv "$f" "${f#urlaub-}"; done

Das Shell-Script entfernt jeweils canon und urlaub am Anfang des Dateinamens in dem Verzeichnis, in dem es ausgeführt wird. Wie definier ich nun das Verzeichnis, in dem es ausgeführt werden soll, inkl. aller Unterverzeichnisse (wenn das Script ganz woanders liegt)?
 
Möglicherweise bringen dich die folgenden Schritte zu einer Lösung:

1] packe mal den mv in ein Skript (z.B. mv.sh) mv $1 ${1#....} und rufe dann in der Schleife mal anstelle des mv das Skript mv.sh auf und gibt den Dateinamen als Aufrufoption mit
2] probiere das Skript auch für längere Pfadnamen hinzubekommen
3] schau dir den find mit dem rm noch einmal an ... ersetze den rm durch das Skript mv.sh und gibt '{}' als Aufrufparameter mit

Itari
 
Aloha!

Nun erstmal danke für den Ansatz, leider blick ich nix davon :/ ich mach hier mehr oder weniger ein auf Guttenberg und geh das neu entdeckte dann nach trail and error durch.

Ich versuch dir mal zu folgen ... konkret:

1. mv.sh erstellen
Code:
#!/bin/sh
mv "$f" "${f#canon-}"
2. rm.sh erstellen
Code:
#!/bin/sh
#
find /volume1/Video/ -name 'canon*.*' -exec /volume1/public/rm.sh
'{}'\;

Wie ich so - wenn ich es denn mal hinbekommen würde - rekursiv Dateien ändern könnte, blick ich obendrein nicht. Edit: okay das kann ich mir jetzt vorstellen :-)

I'm soooo confused :confused:

Cheers
 
Zuletzt bearbeitet:
Code:
[FONT=monospace]
[/FONT]for f in $(find /dein/pfad -type d -name "canon*") ; do mv "$f" "${f#canon-}"; done
der find würde sicherstellen, dass es rekursiv geht und nur Verzeichnisse erwischt werden
 
Da bekomm ich line 1: syntax error: unexpected "(". Dein Script baut, wenn ichs richtig verstanden hab, nicht auf Itaris Vorschlag auf?

btw ich hab -type d rausgenommen, da das Script in erster Linie Dateien ändern soll (für Ordner müsste ich das ganz nochmals mit -type d ausführen, oder könnte man das verwurschteln?)

Anstrengend, aber lehrreich :-)
 
Hm den Fehler kriege ich nicht. Gerade mal bei mir getestet. Allerdings habe ich auch keine canon- Dateien. Ich bau mir mal einen kleinen Test zusammen
 
Danke :-)

Okay, also den syntax-error bekomm ich, da ich das -type d entfernt hab, soviel ist jetzt mal klar. Allerdings bekomm ich ein permission denied ... füg ich dem mv ein -f (laut den options für dont promt before overwriting) krieg ich wieder n syntax error puuuh
 
Ich habe in meinem Testcase jetzt mal Verzeichnisse in der Form test1-canon test2-canon test3-canon angelegt und folgenden Code drübergelassen
Code:
#!/bin/sh
for f in $(find /volume1/public/test -type d -name "*-canon")
 do echo "$f" $(echo $f | awk -F"-canon" '{print $1}')
done
Dieser gibt mir dann
mediaserver> sh /root/test.sh
/volume1/public/test/test2-canon /volume1/public/test/test2
/volume1/public/test/test3-canon /volume1/public/test/test3
/volume1/public/test/test1-canon /volume1/public/test/test1
für Verzeichnisse wäre dieser Code sicher brauchbar. Allerdings würde er bei Dateien allfällige Dateiendungen (oder alles nach -canon) abhacken. Das könnte man aber mittels eines awk Kommandos "umgehen"
Code:
#!/bin/sh
for f in $(find /volume1/public/test -type f -name "*-canon*")
do
  echo "$f" $(echo $f | awk -F"-canon" '{print $1}')".${f##*.}"
done
ergibt dann bei mir
mediaserver> sh /root/test.sh
/volume1/public/test/test3-canon.jpg /volume1/public/test/test3.jpg
/volume1/public/test/test1-canon.jpg /volume1/public/test/test1.jpg
/volume1/public/test/test2-canon.jpg /volume1/public/test/test2.jpg
 
Zuletzt bearbeitet:
Ein Freibier hast du dir sicher!

Leider komm ich selbst nicht weiter (mehrfach probiert *stöhn*), wenn das canon nicht am Ende des Dateinamens steht, was mach ich dann? Falls möglich wäre ein variable Abfrage - Gutdeutsch shiceegal wo canon steht :D - super, ansonsten steht das Ding meist am Satzanfang


for f in $(find /volume1/public/test -type f -name "*canon-*")
do
echo "$f" $(echo $f | awk -F"canon-" '{print $1}')".${f##*.}"

for f in $(find /volume1/public/test -type f -name "canon-*")
do
echo "$f" $(echo $f | awk -F"canon-" '{print $1}')".${f##*.}"

usw. hat alles dazu geführt, dass der Dateinamen, bis auf die Endung abgeschnitten wird, quasi kein Dateinamen mehr existiert.

Ansonsten haut das Script hervorragend hin :-) THANKS!
 
wenn nach canon- noch etwas kommt, dann musst du den Pfad anders zusammensetzen
Code:
for f in $(find /volume1/public/test -type f -name "canon-*")
do
 echo "$f" $(echo $f | awk -F"canon-" '{print $1 $2}')
done
ergibt dann bei mir
mediaserver> sh /root/test.sh
/volume1/public/test/canon-test1.jpg /volume1/public/test/test1.jpg
/volume1/public/test/canon-test2.jpg /volume1/public/test/test2.jpg
/volume1/public/test/canon-test3.jpg /volume1/public/test/test3.jpg
 
Sollt ich mal wieder in der Schweiz auf Partytour sein - Sommer - dann geb ich dir Bescheid, Getränke gehn aufs Haus :D

Code:
#!/bin/sh
for f in $(find /volume1/Video -type f -name "*tvp-*")
do mv "$f" $(echo $f | awk -F"tvp-" '{print $1 $2}')
done
So funktionierts (das echo durch mv zu ersetzen war schon richtig?)! Dankeman :-) ... aber vermutlich kommen die Tage noch ein paar Vertiefungsfragen *augenroll*

Ich hau mich jetzt erstmal auf die Couch. CU later
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat