Erledigt Frage an unserer PHP Profis

atom

Bekanntes Mitglied
Nabend

Ich bräuchte mal wieder die Unterstützung der Expertengemeinde.

Ausgangssituation:
In einem Ordner auf einem Webserver landen täglich Dateien (zwischen 1 und max. 50 Stk.), deren Name bis auf den ersten Teil variiert. In regelmäßigen Abständen gibt es da Dateien, welche immer größer als 3 MB sind. Und genau diese Dateien möchte ich finden und in einen Unterordner verschieben. Das ganze würde ich als Cronjob einrichten und all x Stunden laufen lassen.
Der Dateiname ist immer so aufgebaut: GLEICHERNAME_xyz_abc.zip (dabei können xyz und abc alphanumerisch sein und unterschiedliche Längen haben).

Wie man Deitegrößen mit PHP ermitteln kann habe ich mir schon erlesen. Allerdings gehen alle Beispiel, die ich so finden konnte, von fixen Dateinamen aus und behandeln immer nur eine Datei. Und das ist mein Problem. Bis auf den fettgeschiebenen Teil GLEICHERNAME_xyz_abc.zip kenne ich die Dateinamen nicht.

Habt ihr hier eine zündende Idee für mich?
Oder geht das auch nach dem Schema: lies die Dateigröße von allen *.zip in Ordner 1 aus, finde alle Dateien > 3 MB und verschiebe diese nach Ordner 2?
Dann müsste ich den Dateinamen ja nicht kennen, oder. :icon_confused:

Ich sage schon mal heftig Danke. :icon_prost:

cu aTom
 
Zuletzt bearbeitet:

Antitrack

Bekanntes Mitglied
Bash script:

find /start/ordner/verzeichnis -iname "gleicherteil*" -size +3M -exec mv {} /ziel/verzeichnis ; \

Das in die Crontab und das wars.
 

atom

Bekanntes Mitglied
Hi Antitrack,

danke für die Antwort. Muss ich mal versuchen, ob das als Cron in der Konsole aufrufen kann. Könnte sein, dass mir hier die nötigen Rechte fehlen. Solche Crons kann man auf jeden Fall nur ausführen, wenn ich das in ein PHP script mit exec packe, wenn ich das richtig verstanden habe (steht so sinngemäß beim Hoster).

Noch 'ne kurze Frage: Sind die Pfadangaben "/start/ordner/verzeichnis" und "/ziel/verzeichnis" absolut zum root zu verstehen oder relativ zum Ort des PHP Scriptes?

Herzlichen Dank.
 

Antitrack

Bekanntes Mitglied

dr_tommi

alter Oldie
Noch 'ne kurze Frage: Sind die Pfadangaben "/start/ordner/verzeichnis" und "/ziel/verzeichnis" absolut zum root zu verstehen oder relativ zum Ort des PHP Scriptes?
Pfadangaben, die mit "/" beginnen, beziehen sich unter Linux immer absolut auf den Pfad von ganz oben also von Root aus. Bei Windows analog beginnend mit "\".
Relative Pfade beginnen mit "." für das aktuelle Verzeichnis.
 

atom

Bekanntes Mitglied
Danke Euch beiden, dass Ihr mir das so toll erklärt. Nun werde ich mich die Tage an die Umsetzung machen und berichte Euch dann. ;)

cu aTom
 

atom

Bekanntes Mitglied
So, hab mich doch mal rangesetzt.

Leider nur ein Teilerfolg. Dank Eurer Hilfe und etwas lesen funktioniert das Script in der Konsole so, wie ich mir das vorstelle.

Bash:
#!/bin/bash
DIR="$(cd "$(dirname "$0")" && pwd)"

if [[ "$DIR" != */Testordner ]]; then
    echo "Kein Verzeichnis gefunden."
    exit 1
fi

find $DIR -maxdepth 1 -iname "GleicherTeil_*" -size +3M -exec mv {} $DIR/alt/ \;
Doof ist, dass ich das Script nicht mittels PHP zum Laufen bekomme. Denn der direkte Aufruf von Bash Scripen als Cron lässt der Hoster nicht zu. Daher soll man den Umweg über ein PHP Script nehmen.
Dazu gibt's gleich den netten Hinweis: Beachten Sie, dass nicht alle Shellbefehle [...] ausgeführt werden können, da einige Befehle aus Sicherheitsgründen gesperrt sind.
Leider schweigt sich der Hoster aus, welche Shellbefehle dann nicht erlaubt sind...

Und ja, das stimmt, denn es kommt direkt nach dem Aufruf:
/usr/bin/find: Permission denied

Wenn ich hier jedesmal die Konsole anwerfen soll um das Script auszuführen, kann ich das auch gleich per Hand machen. :icon_knock:

Schade, aber sieht echt so aus, als wenn ich das doch irgendwie mit PHP umsetzen muss. Oder habt ihr noch eine Idee?

Ich gebe erst einmal auf für heute.

cu aTom

//EDIT

Hat mir dann doch keine Ruhe gelassen.
Das ganze habe ich nun mit PHP umgesetzt. Den Weg dahin hat mir Antitrack im Prinzip schon in seiner ersten Antwort gezeigt.

Ist sicher nicht besonders elegant gelöst, aber es funktioniert erst einmal zufriedenstellend.

PHP:
foreach (glob("./Testordner/GleicherTeil_*.zip") as $filename) {
   
    $fileSizeBytes = filesize($filename);

    $fileSizeMB = ($fileSizeBytes / 1024 / 1024);
   
    $fileSizeMB = number_format($fileSizeMB, 2);
   
    $file = substr("$filename", 13);
       
    if ($fileSizeMB > 3) {
       
        rename('./Testordner/' . $file,'./Testordner/alt/' . $file);
    }
}
Danke euch beiden!

cu aTom
 
Zuletzt bearbeitet:

ibinsfei

Team (Technik) - BOFH
Mitarbeiter
Etwas leichter zu warten wäre z.B.:
PHP:
<?php
define('FILEPATH', './Testordner/');
define('BIGFILEPATH', './Testordner/alt/');
define('FILEPATTERN', 'GleicherTeil_*.zip');
define('MINSIZE_TO_MOVE', 3145728);

is_dir(FILEPATH) or die('filepath ' . FILEPATH . ' doesnt exist or is not a directory'."\n");
is_dir(BIGFILEPATH) or die('bigfilepath ' . BIGFILEPATH . ' doesnt exist or is not a directory'."\n");

foreach (glob(FILEPATH . FILEPATTERN) as $filename) {
        if(is_file($filename) && filesize($filename) > MINSIZE_TO_MOVE) {
                $basefilename = basename($filename);
#                echo "move ".$basefilename." (".filesize($filename).")\n";
                rename(FILEPATH . $basefilename, BIGFILEPATH . $basefilename);
        }
}
 

atom

Bekanntes Mitglied
@ibinsfei

Danke dafür, das Du mein Gestümper noch etwas aufgehübscht hast.
Vielen Dank auch für den Wink mit dem Zaunpfahl zu basename!
So lässt sich das tatsächlich universeller warten und einsetzen. :yo

cu aTom
 
Zuletzt bearbeitet:
Oben Unten