Benutzerdefinierte Suche

rekursives verschieben/löschen von mp3

  1. AndiDreas

    AndiDreas Thread StarterMacUser Mitglied

    Mitglied seit:
    15.02.2005
    Beiträge:
    39
    Zustimmungen:
    0
    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
     
    AndiDreas, 22.04.2005
  2. Horror

    HorrorMacUser Mitglied

    Mitglied seit:
    03.02.2003
    Beiträge:
    1.416
    Zustimmungen:
    9
    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
     
    Horror, 22.04.2005
  3. AndiDreas

    AndiDreas Thread StarterMacUser Mitglied

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

    vielen dank !
     
    AndiDreas, 22.04.2005
  4. maceis

    maceisMacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    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
     
    maceis, 22.04.2005
  5. AndiDreas

    AndiDreas Thread StarterMacUser Mitglied

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

    -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...
     
    AndiDreas, 22.04.2005
  6. maceis

    maceisMacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    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
     
    maceis, 22.04.2005
  7. AndiDreas

    AndiDreas Thread StarterMacUser Mitglied

    Mitglied seit:
    15.02.2005
    Beiträge:
    39
    Zustimmungen:
    0
    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*
     
    AndiDreas, 22.04.2005
  8. ratti

    rattiMacUser Mitglied

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

    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 :)
     
    ratti, 22.04.2005
  9. maceis

    maceisMacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    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.
     
    maceis, 22.04.2005
  10. ratti

    rattiMacUser Mitglied

    Mitglied seit:
    09.05.2004
    Beiträge:
    1.515
    Zustimmungen:
    56
    (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
     
    ratti, 22.04.2005
Die Seite wird geladen...
Ähnliche Themen - rekursives verschieben löschen
  1. rologötz
    Antworten:
    2
    Aufrufe:
    643
    Olivetti
    06.10.2016
  2. Pixelgeier
    Antworten:
    7
    Aufrufe:
    436
    Pixelgeier
    29.09.2016
  3. huuma29
    Antworten:
    6
    Aufrufe:
    2.282
    diver68
    14.03.2014
  4. ObiTobi
    Antworten:
    3
    Aufrufe:
    956
    ObiTobi
    08.09.2013
  5. Atalantia
    Antworten:
    5
    Aufrufe:
    2.155