Shell Find befehl mit exec

  • Guten Morgen allerseits


    Ich habe mich solangsam an die Shell mit Putty von meinem NAS TS-109 gewöhnt und möchte nun tiefer in die UNIX Shell Commands einsteigen.


    Angefangen habe ich eigentlich mit einem recht einfachen Task.


    Ich möchte ordnerübergreifend bestimmte Dateien nach einem Muster (regex) suchen und dann damit etwas machen.


    Explizit zum beispiel alle Playlisten (M3U) suchen und in einen gemeinsamen Ordner kopieren.


    Nach diversen Googlesuchen habe ich den befehl Find gefunden.


    Innerhalb der shell habe ich also: find -name "*.m3u" -exec mv /m3u {} \; eingegeben.


    Jedoch scheint der Find Befehl der BusyBox in meinem Nas das exec nicht zu erkennen. Das ist sehr schade, weil dadurch der find befehl irgendwie ad absurdum geführt wird.
    Vielleicht mache ich auch was falsch, ich weiss es nicht. Gibt es jemanden der da näheres zu weiss ?


    PS: Ich habe sogar versucht per find -name "*.m3u" | mv /m3u also über pipes das weiter zu leiten, klappt jedoch nicht :(

  • Zitat von "Chtonian"

    Jedoch scheint der Find Befehl der BusyBox in meinem Nas das exec nicht zu erkennen. Das ist sehr schade, weil dadurch der find befehl irgendwie ad absurdum geführt wird.Vielleicht mache ich auch was falsch, ich weiss es nicht. Gibt es jemanden der da näheres zu weiss ?


    Nein, da hast du nichts falsch gemacht, das find vom NAS ist stark eingeschränkt.
    IM IPKG/QPKG gibt es meines Wissens ein Find mit den erforderlichen Parametern.


    Es gibt aber noch die Möglichkeit über den Umweg einer Datei:

    Code
    find -name "*.m3u"  > /tmp/m3u.lst
    FILES=`cat /tmp/m3u.lst` 
    for f in $FILES
    do
        mv $f /m3u
    done
  • Hallo,
    ich habe ein ähnliches Problem, bei mir läuft Joomla auf einem QNAP TS-209 und ich möchte die Rechte der Dateien und Verzeichnisse rekursiv setzen, z.B durch:


    find /share/Qweb/Joomla/ -type d -exec chmod 755 {} \;


    Find in QNAP kann das exec nicht, und leider weiß ich nicht weiter. Ein anderes find bietet QNAP nicht an und einen anderen Umweg weiß ich noch nicht.


    Vielleicht kann mir ja jemand dabei helfen.. :?::!:
    Danke!

  • Hallo Stefan,
    vielen Dank für den Hinweis. Habe jetzt in etwa folgendes Script um z.B. allen Ordnern und Dateien bestimmte Rechte zuzuordnen:
    #!/bin/sh
    find -type d > /tmp/directories.txt
    FILES=`cat /tmp/directories.txt`
    for f in $FILES
    do
    chmod 755 $f
    done
    find -type f > /tmp/files.txt
    FILES=`cat /tmp/files.txt`
    for f in $FILES
    do
    chmod 644 $f
    done
    Das klappt prinzipiell auch ganz gut.
    Es kommt bei Dateien mit einem Leerzeichen im Namen, z.b. "eine datei.txt" folgender Fehler:


    chmod: ./eine: No such file or directory
    chmod: datei.txt: No such file or directory


    Also irgendwie müsste man das script noch ändern dass es mit Leerzeichen im Dateinamen klar kommt.
    Nur wie? Für einen Hinweis wäre ich dankbar!

  • Du ahnst nicht, wie einfach die Lösung ist, du schlägst dir mit Sicherheit die Hand vor den Kopf. :D


    Du brauchst nur um die Variable $f, die den Pfad beinhaltet mit " begrenzen -> "$f" :


    EDIT: Fehler in Script behoben.

  • Ich hatte das gleiche Problem und habe es wie oben erwähnt über ipkg gelöst, da ich mit meinem Script auch nicht weiterkam (" " funktionieren auch bei mir nicht).


    Login über SSH, dann:
    ipkg install findutils
    /opt/bin/find /verzeichnis/ -type d -exec chmod 755 {} +
    /opt/bin/find /verzeichnis/ -type f -exec chmod 644 {} +

  • Ich hatte im Script die wichtige Zeile

    Code
    IFS="\n"

    vergessen gehabt.
    Ist mir zu dem Zeitpunkt nicht aufgefallen.
    Dabei kann dann das " bei "$f" jewils entfallen.

  • Puuuuuhhhhh muffelt das hier.
    Wenn du schon ein fast sieben Jahre altes Thema ausgräbst, dann erkläre bitte warum.
    Wenn schon mit '$' dann bitte so:

    Code
    IFS=$'\x0A'