Forum Linux.débutant Répertoires qui ne contiennent pas ce fichier

Posté par  .
Étiquettes : aucune
0
14
déc.
2007
Bonjour,

Peut-on utiliser des commandes de base pour trouver les noms des répertoires NE contenant PAS un fichier particulier (plus précisément un fichier avec une extension particulière, pas c'est pareil) ?

Le but étant de trouver parmi des centaines de répertoires, ceux qui ne contiennent pas de playlist .m3u.

Merci.
  • # solution

    Posté par  . Évalué à 4.

    Solution pas forcément optimal mais ça fonctionne (en tout cas, sur cygwin au boulot)

    # Création de la liste des répertoires contenant '*m3u' à partir du répertoire courant
    find . -name '*.m3u' | xargs -l dirname | uniq > mylist.txt

    # Création de la liste de tous les répertoires à partir du répertoire courant
    du . | cut -f2 > all_dir.txt

    # On ne garde que les répertoires n'étant pas dans les 2 fichiers
    cat all_dir.txt mylist.txt | sort | uniq -u
    • [^] # Re: solution

      Posté par  . Évalué à 4.

      et un :

      find . -type d -exec sh -c 'ls $1 | grep -q "m3u$"' '{}' '{}' ';' -print
      • [^] # Re: solution

        Posté par  . Évalué à 3.

        Ouah j'aurais pu être super content (même si la solution déjà donnée fonctionne) mais ça ne passe pas, à cause des espaces dans les titres je pense.
        • [^] # Re: solution

          Posté par  . Évalué à 4.

          de toutes facons ca t'aurais donne le resultat inverse (dossiers qui contiennent un m3u)

          L'intelligence collective de bouchot a fini par pondre ceci :

          find . -type d -exec sh -c 'ls -x "$1" | grep -vq "m3u\b"' {} {} \; -print
        • [^] # Re: solution

          Posté par  . Évalué à 2.

          find . -type d -exec sh -c 'ls -x "$1" | grep -vq "m3u\b"' '{}' '{}' \; -print

          fonctionne avec les noms avec espaces.
          • [^] # Re: solution

            Posté par  . Évalué à 1.

            Niet : il m'affiche tous les répertoires (très lentement, puisqu'il y applique le traitement).

            En plus, pas de caractères accentés (contrairement à la longue soluce)
            • [^] # Re: solution

              Posté par  . Évalué à 2.

              T'es sûr j'ai essayé et ça fonctionne, par contre il faut faire un ls -ax pour prendre en compte les dossiers vides :


              # ls -lR
              .:
              total 40
              drwxr-xr-x 2 root root 4096 Dec 14 15:38 toté
              drwxr-xr-x 2 root root 4096 Dec 14 15:39 to to
              drwxr-xr-x 2 root root 4096 Dec 14 15:21 toto1
              drwxr-xr-x 2 root root 4096 Dec 14 15:21 toto2
              drwxr-xr-x 2 root root 4096 Dec 14 15:20 toto3

              ./toté:
              total 0

              ./to to:
              total 0

              ./toto1:
              total 4
              -rw-r--r-- 1 root root 0 Dec 14 15:21 toto.m3u

              ./toto2:
              total 8
              -rw-r--r-- 1 root root 0 Dec 14 15:21 toto.m3u
              -rw-r--r-- 1 root root 0 Dec 14 15:21 toto.mp3

              ./toto3:
              total 0

              # find . -type d -exec sh -c 'ls -ax "$1" | grep -vq "m3u\b"' {} {} \; -print
              .
              ./toto3
              ./to to
              ./toté


              Testé sur une RHEL 4
              • [^] # Re: solution

                Posté par  . Évalué à 1.

                Niet et re-niet : ça sort tous les dossiers et avec un mauvais traitement des accents... mais sous cygwin.
                • [^] # Re: solution

                  Posté par  . Évalué à 1.

                  Je ne comprends pas trop d'ailleurs comment ça pourrait fonctionner.

                  [code]ls -ax "$1" | grep -vq "m3u\b"[/code]

                  ça ne donne rien.

                  Si j'enlève le --quiet ça donne les lignes qui ne contiennent pas de m3u.
                  • [^] # Re: solution

                    Posté par  . Évalué à 2.

                    c'est le code retour de grep qui fait le tout
                    • [^] # Re: solution

                      Posté par  . Évalué à 1.

                      Ok, c'est bien en effet... mais ça ne passe pas.

                      Donc, en tant que deboggeur des soluces que l'on me propose, cette modif fonctionne :

                      find . -type d ! -exec bash -c 'ls -ax "$1" | grep -q "m3u\b"' {} {} \; -print

                      Pourtant grep -v fonctionne très bien sous cygwin. M'enfin...

                      Reste que les caractères accentués ne sont pas pris en charge.
    • [^] # Re: solution

      Posté par  . Évalué à 4.

      Merci pour cette proposition de solution.

      Je n'avais pas pensé à faire ainsi : j'essayais de bourriner avec seulement avec find...

      Par contre, légère modif à apporter car le nom des rep n'est pas toujours bon (par exemple ./1 Giant Leap pose problème).

      En plus c'est plus court (mais pas forcément plus rapide) :
      find . -name '*.m3u' -exec dirname {} \; > mylist.txt

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.