Ihr mögt das, oder?

  • optional
    link
    fedilink
    43 months ago

    Warum nicht einfach

    ls */
    

    Falls das find wichtig sein sollte, das nämlich nur echte Verzeichnisse findet und keine symbolischen Verknüpfungen auf Verzeichnisse, ginge auch

    find . -mindepth 1 -maxdepth 1 -type d -exec ls {} +
    
    • @[email protected]
      link
      fedilink
      23 months ago

      Warum nicht einfach ls */

      Weil ich das so verstanden hatte als dass OP gern irgendwas pro Verzeichnis ausführen wollte. Das ls ist nur Platzhalter.

      • optional
        link
        fedilink
        13 months ago

        Ah, den Kommentar hat mein Gehirn zwischen den ganzen "'"'${}'"'; auf dem Handy wohl einfach ausgeblendet. Für mich funktioniert das Script übrigens fast unverändert, sogar mit Ordnern die " " oder "

        " heißen. Ich habe nur die ganzen überflüssigen " und $ und { und ’ entfernt und das … am Ende wieder eingefügt. Ach ja, und das | exit eingefügt, damit das Script bei fehlschlagendem Verzeichniswechsel nicht komplett Amok läuft. Das war ein guter Tipp von shellcheck:

        #!/bin/bash
        while IFS= read -d $'\0' -r "dir" ; do·
              cd "$dir" || exit
              pwd
              ls
              touch penis                                                                                                                                                         
              cd ..
        done < <(find ./  -mindepth 1 -maxdepth 1 -type d -print0)
        

        Je nachdem, was Du mit dem kram vorhast, bitte auch noch diese Sicherheitshinweise beachten.

        • @[email protected]
          link
          fedilink
          13 months ago

          Also entweder ist das eine Syntax, die ich nicht kenne (gut möglich), oder die ganze done-Zeile ergibt überhaupt keinen Sinn. Müsste es nicht eher << sein und auch eine Subshell, also $(...) anstatt einfach nur einem Klammernpaar?

          Und grundsätzlich weiß ich nicht, wieso man das so kompliziert pipen möchte.

          • optional
            link
            fedilink
            Deutsch
            1
            edit-2
            3 months ago

            Ich hätte auch einfach find ... | while read ... geschrieben, aber warum einfach, wenn’s auch kompliziert geht.

            <(kommando) nennt sich Prozesssubstitution. Vereinfacht gesagt, wird die Ausgabe des Kommandos in eine benannte Pfeife umgeleitet und das <() dann durch deren Namen ersetzt. Das ist ganz praktisch, wenn ein Kommando Eingaben nur als Dateinamen erwartet und nicht mit stdein arbeiten kann. Z.B. um den Inhalt zweier Verzeichnisse zu vergleichen:

            diff <(ls foo/) <(ls bar/)
            

            Mit < leitet man den Inhalt einer Datei an die stdein eines Befehls weiter. Der Vorteil der Version von OP ist, dass für den While-Teil keine Untermuschel aufgemacht wird. Wenn man also nach der Schleife noch mal auf Variablen zurückgreifen möchte, die man in der Schleife gesetzt hat, funktioniert mein Beispiel mit dem | nicht, bzw. nicht in jeder Version von jeder Muschel.