rekursives verschieben/löschen von mp3

Dieses Thema im Forum "Mac OS X - Unix & Terminal" wurde erstellt von AndiDreas, 22.04.2005.

  1. AndiDreas

    AndiDreas Thread Starter MacUser Mitglied

    Beiträge:
    39
    Zustimmungen:
    0
    MacUser seit:
    15.02.2005
    hallo ich habe ein kleines problem.
    ich habe eine seite mittels httrack gespiegelt...
    nun möchte ich von diesen ganzen Dateien allerdings
    nur die pdf und doc dateien haben. es ist doch sicher
    mit den unix-kommandozeilentools folgendes zu machen:

    was genau ich machen möchte, schreibe ich hier einfach mal
    nieder...also

    "durchsuche das verzeichniss /mirror und alle unterverzeichnisse
    nach *.pdf und *.doc, kopiere die *.pdf Datei nach /archiv/pdf und
    die *.doc Dateien nach /archiv/doc...lösche danach /mirror"...

    :-/ hoffe das klingt nicht sooo kompliziert..

    im prinzip: rekursivs durchstöbern eines verzeichnisses...
    und wenn bestimmter dateityp gefunden, soll dieser in
    ein verzeichniss kopiert werden...achja...gut wäre es
    bei doppelten dateien, z.b. eine -1 -2 nummer anzuhängen
    (ansonsten einfach überschreiben).

    kann mir da jemand vielleicht helfen?

    alleine mit den man pages für die befehle rm cp mv komme ich nicht
    weiter leider :-/ bin da absoluter neuling
     
  2. Horror

    Horror MacUser Mitglied

    Beiträge:
    1.416
    Zustimmungen:
    9
    MacUser seit:
    03.02.2003
    Also am besten nimmst du dafür den Befehl find.

    PHP:
    find /mirror -name *.pdf
    Der Befehl liefert dir alle pdf-Dateien im Ordner /mirror (rekursiv). Mit der Option -exec kannst du eigene Kommandos ausführen, da kannst du z.b. ranhängen, dass er die Dateien in einen bestimmten Ordner kopieren soll. Wie das genau geht, musst du mal bitte selber schauen ;) Vielleicht reicht dir ja auch schon man find. Die Sache sollte dann zweimal laufen, einmal für .doc und einmal für .pdf. Das Löschen kannst du ja dann per Hand machen oder mit einem rm -r /mirror.

    Dirk
     
  3. AndiDreas

    AndiDreas Thread Starter MacUser Mitglied

    Beiträge:
    39
    Zustimmungen:
    0
    MacUser seit:
    15.02.2005
    syntax

    vielen dank !
     
  4. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Fast richtig, aber nicht ganz ;)
    Der '*' muss auf jeden Fall escaped werden, da er sonst bereits von der Shell ausgewertet wird und nicht von 'find'.

    find /mirror -iname \*.pdf -exec mv {} /daten/ \;

    verschiebt alle Dateien unterhalb von '/mirror', die auf '.pdf' oder '.PDF' enden, nach '/daten' (das Verzeichnis '/daten' sollte schon existieren).


    HTH
     
  5. AndiDreas

    AndiDreas Thread Starter MacUser Mitglied

    Beiträge:
    39
    Zustimmungen:
    0
    MacUser seit:
    15.02.2005
    ...

    -exec utility [argument ...];
    True if the program named utility returns a zero value as its
    exit status. Optional arguments may be passed to the utility.
    The expression must be terminated by a semicolon (``;''). If the
    string ``{}'' appears anywhere in the utility name or the argu-
    ments it is replaced by the pathname of the current file.
    Utility will be executed from the directory from which find was
    executed. Utility and arguments are not subject to the further
    expansion of shell patterns and constructs.

    wie ist dies denn zu verstehen ?

    kennt vielleicht generell jemand eine gute seite, in denen es ne menge beispiele für shellskripte gibt ???? ich lese mich ständig durch welche man-files aber mir fehlt es einfach an ?erfahrung? oder erkenntniss :-D...
     
  6. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Mit 'exec utility' wird das Kommando <utility> ausgeführt; in diesem Fall 'mv'

    Den "return value" benötigst Du diesmal nicht; damit könntest Du prüfen, ob das Kommando erfolgreich ausgeführt werden konnte (return value = 0 => Kommando erfolgreich ausgeführt).

    Optionales Argument ist in diesem Fall '{}'.
    Es wird durch den aktuell gefundenen Dateinamen mit Pfad ersetzt (also mit den Dateinamen die auf .pdf enden)

    Der gesamte Ausdruck (also das Kommando mit evtl. Argumenten) muss mit ';' terminiert werden, damit 'find' weiss, wo er zu Ende ist (können ja danach noch weitere Ausdrücke kommen).
    Der backslash vor ';' ist notwendig, da ';' sonst von der Shell ausgewertet wird und nicht an 'find' übergeben wird; die Folge wäre ein Syntax-fehler

    HTH
     
    Zuletzt bearbeitet: 22.04.2005
  7. AndiDreas

    AndiDreas Thread Starter MacUser Mitglied

    Beiträge:
    39
    Zustimmungen:
    0
    MacUser seit:
    15.02.2005
    suuuuuupi

    danke,...so wie du das erklärst versteh ich das nun auch :-D

    nun weiss ich auch wieso die geschweiften klammern da sind..das hatte mich zunächst verwirrt...feine sache....und vor allem schön schnell, wenn man nur weiss wie man mit den ganzen cmd-tools umgeht. danke danke danke. *verneig*
     
  8. ratti

    ratti MacUser Mitglied

    Beiträge:
    1.515
    Zustimmungen:
    56
    MacUser seit:
    09.05.2004

    Fast richtig, aber nicht ganz :)))

    1. Quoten: mv "{}".
    2. Vielleicht erstmal cp statt mv :))

    3. Klugscheisserweise: Das geht in die Hose, wenn es z.B. einen Ordner(!) mit dem Namen "downloads.pdf" gibt. Daher noch: -type f

    find /mirror -iname '*.pdf' -type f -exec cp "{}" /daten/ \;

    ...und wenn es nicht um "normale" Dateien geht, sondern um welche mit Ressource-Forks, dann empfehle ich dringendst die Installation des Developer-Pakets und die Benutzung von "MacMv / MacCp". Sonst kaputt. Naja - noch! In Tiger wird endlich, endlich, endlich ein HFS+-kompatibles cp/mv enthalten sein.


    Ansonsten: Ich bin ja auch ein großer Terminal-Fan, aber das hätte man auch mit "Apfel-F" machen können ("Dateiname endet mit .pdf") und dann mit der Maus rumschubsen. Interessant wird das ganze mit Optionen wie "mindepth" und "maxdepth", oder wenn die Auswertung mehr erfordert als ein simples "mv".

    exit,
    ratti :)
     
  9. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Doch!
    Definitiv nicht notwendig. [STICHELMODE] Von Dir hätte ich erwartet, dass Du die man-page liest, ratti ;) [/STICHELMODE].
    Möglich, aber ebenfalls nicht wirklich notwendig!
    Abhängig vom gewünschten Ergebnis; wenn der Ordner "downloads.pdf" verschoben werden soll, geht nix in die Hose ;).
    Der Hinweis ist aber natürlich berechtigt.
    Developer-Tools (rd. 1GB) nur deswegen installieren, ist overkill.
    Dateien, die eine Resourcefork enthalten, kann man mit 'ditto --rsrc' problemlos kopieren.
    Bei *.pdf- und *.doc-Dateien sollte es aber grundsätzlich keine Probleme geben.
     
    Zuletzt bearbeitet: 22.04.2005
  10. ratti

    ratti MacUser Mitglied

    Beiträge:
    1.515
    Zustimmungen:
    56
    MacUser seit:
    09.05.2004
    (Quoten)
    Nixda! :)

    Genau das sagt meine manpage aber. Die ist allerdings nicht die vom Mac:


    -exec command ;
    Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ‘;’ is encountered. The string ‘{}’ is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.
    Both of these constructions might need to be escaped (with a ‘\’) or quoted to protect them from expansion by the shell. The command is executed in the starting directory.

    ...und "info 'Finding Files' gibt als Beispiel an:

    find . -name '*.h' -exec diff -u '{}' /tmp/master ';'


    Ich habe mir das Quoten angewöhnt. Es schadet an dieser Stelle nichts, und wenn man sowas macht wie

    find -iname "*.dat" -exec rm "{}.*.tmp" \;

    dann muss man wieder quoten. Deswegen quote ich immer.


    Ich muss dir aber soweit recht geben, dass zumindest bei mir in der bash keine Probleme auftreten, wenn ich mir eine Datei "test test" oder "test*" anlege.



    (type -f)
    Bei mv nicht, bei cp oder rm schon (nicht rekursiv per default), und abgesehen davon ist es schlechter Stil. Früher oder später geht sowas schief, und dann gibt es keinen Mülleimer.

    ...und ich würde nie im Leben ein find-exec auf mv oder rm loslassen, ohne nicht wenigstens einmal vorher "ls -lad '{}'" ausprobiert zu haben...


    Da installiere ich doch lieber die Developertools und verzichte auf den REST des Systems... :)
    Du hast Rest. Ich installiere grundsätzlich überall die DevTools drauf - allein schon wegen SetFile und so.

    Gruß,
    Ratti
     
    Zuletzt bearbeitet: 22.04.2005
Die Seite wird geladen...