Forum Programmation.shell Comment faire ?

Posté par  (site web personnel) .
Étiquettes : aucune
0
5
sept.
2005
Salut à tous !
j'ai quelques scripts bash à écrire pour la fac et je galère un peu...

Le script que je développe doit donner la taille du plus petit et du plus grand fichier d'un répertoire.

La ou est mon problème c'est qu'il doit renvoyer les chemins de fichier complets et pas seulement les noms.

Donc mon idée est de récupérer le bazar avec ls de récupérer les plus petites et plus grandes tailles... Ca je devrais pouvoir le faire seul mais je ne trouve aucun moyen de récupérer les noms complets...

Merci beaucoup pour le coup de pouce éventuel :) !
  • # Use the force

    Posté par  . Évalué à 2.

    find . est ton ami !
  • # ls ... entre autre :)

    Posté par  . Évalué à 1.

    ls -1artd `pwd`/*

    1 : sur une colonne
    a : tous
    r : inversé le cas échéant
    t : tri temporel
    d : on ne veut pas lister les répertoires [1]
    l : si on veut la date [2]

    `pwd` : on liste les fichiers du rep courant avec leur chemin complet

    [1] Si on veut obtenir le même résultat avec le listage des fichiers des sous-répertoires, il faudra surement passer par un "find -exec ls -lartd " ou une autre astuce du genre.

    [2] pipé sur un petit sed ou awk si on veut juste la date et le nom complet du fichier.
    • [^] # Re: ls ... entre autre :)

      Posté par  (site web personnel) . Évalué à 4.

      Il voulait la taile pas la date :)

      Le plus gros :

      [pterjan@plop admin]$ ls -FSd `pwd`/* | sed -e '/\/$/d' -e 's/*$//' | head -n 1
      /home/pterjan/work/dassault/mksysb/code/admin/initrd

      Le plus petit :

      [pterjan@plop admin]$ ls -FSd `pwd`/* | sed -e '/\/$/d' -e 's/*$//' | tail -n 1
      /home/pterjan/work/dassault/mksysb/code/admin/TODO

      Le -F du ls et le sed servent à virer les répertoires
      • [^] # Re: ls ... entre autre :)

        Posté par  (site web personnel) . Évalué à 1.

        Yeah je commence à comprendre tes commandes...
        Si je comprends bien tu scannes tous les fichiers du répertoire courant tu les tries avec sed et tu prends au choix la première ou la dernière ligne du résultat. (je comprends pas trop la syntaxe du sed, je vais fouiller le man un coup...)

        Donc si je comprends toujours bien le -F dans le ls permet d'enlever les répertoires et d'examiner seulement le contenu du répertoire courant...

        Donc si j'enlève le -F du ls mais pas du sed il devrait me faire le même boulot mais de manière récursive ?

        Réponds oui et mon script est quasiment terminé x)
        • [^] # Re: ls ... entre autre :)

          Posté par  (site web personnel) . Évalué à 1.

          J'ai vraiment du mal à comprendre comment se fait le classement sur taille parce que quand je copie colle la premiere partie de ta commande, celle avec le ls, a aucun moment la taille n'apparaît...
    • [^] # Re: ls ... entre autre :)

      Posté par  (site web personnel) . Évalué à 1.

      moi je dirais plutot un :
      du -m * | sort ( la mise en forme reste a faire )

      t'as commande fait bien un tri temporel ? ...alors qu'il est demandé un tri sur la taille
      • [^] # Re: ls ... entre autre :)

        Posté par  (site web personnel) . Évalué à 1.

        Oh my god.
        Je n'en attendais pas autant !
        Dire que je pensais que linuxfr se vidait...
        Je pense que dans le cadre de mon script le du suffira, parce qu'il me donne exactement ce qu'il me faut sauf que je regarde dans les pages man et info et je trouve aucun moyen de virer optionnellement les répertoires.
        Si je comprends bien avec l'option depth à zéro il me renverra quand même les répertoires mais avec leur taille totale ce qui m'embête pas mal...
        Bon en attendant de voir si quelqu'un a une idée je vais fouiller les idées que vous venez de me donner.
        Merci mille fois! :)
  • # re : Comment faire ?

    Posté par  . Évalué à 1.

    sous UNIX : ls -l | sort -nbk 5

    sous LINUX : ls -l | sort -gbk 5

    bon bien sur cela te donne les valeurs en octets
  • # récursivement

    Posté par  (site web personnel) . Évalué à 2.

    $ find $PWD -type f | xargs du -sb | sort -n | tee /tmp/bla | head -n1 ; tail -n1 /tmp/bla
    Ou bien:
    find $PWD -type f -exec du -sb '{}' ';' | sort -rn | tee /tmp/bla | head -n1 ; tail -n1 /tmp/bla
    Sans fichier temporaire (mais avec du Perl):
    find $PWD -type f -exec du -sb '{}' ';' | perl -ane'($max, $maxf) = @F if !$max || $max < $F[0]; ($min, $minf) = @F if !$min || $min > $F[0]; END{print "$max\t$maxf\n$min\t$minf\n"}'
    Il y a sans doute moyen de remplacer le Perl par du awk.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Mon script, tadaaa

    Posté par  (site web personnel) . Évalué à 1.

    #!/bin/bash
    #sizescan : this scripts scans the current directory/directory tree in order to give the smallest and
    #largest file.
    #usage : sizescan [-r] [directory]
    #if no directory is given the script will scan the current one. If the -r option is given the script will scan
    #directories recursively
    
    #variables initializations
    directoryDoesNotExist=1
    recursive=1 			#starts with false
    syntaxError=1
    
    
    #check the options for incorrect combinations
    #if we have two arguments the first one should be -r and the second one should be a valid directory
    if [ $# = 2 ]
        then
        #is the first arg -r ?
        if [ $1 = "-r" ]
    	then
    	recursive=0
    	else
    	syntaxError=0
        fi
        #is the second argument a valid path ?
        if [ -d $2 ]
    	then
    	toScan=$2
    	else
    	directoryDoesNotExist=0
        fi
    fi
    #if we face a single argument it should be -r or a valid path
    if [ $# = 1 ]
        then
        if [ -d $1 ]
        	then
    	toScan=$1
    	else
    	if [ $1 = "-r" ]
    	    then
    	    recursive=0
    	    toScan=`pwd`
    	    else
    	    directoryDoesNotExist=0
    	fi
        fi
    fi
    
    #otherwise we just set the scanned directory to current one
    if [ $# = 0 ]
        then
        toScan=`pwd`
    fi
    
    #if we have a syntax error we print the appropriate message
    if [ $syntaxError = 0 ]
        then
        echo Usage sizescan [-r] [directory]
        echo -- -r option scans directories recursively
        exit 1
    fi
    
    #if the provided directory doesn t exist we print the appropriate errror message
    if [ $directoryDoesNotExist = 0 ]
        then
        echo Provided directory doesn\'t exist!
        exit 1
    fi
    
    
    #Okay, at this stage our options are correct, we know what we want to do and we are sure the directory actually exists
    
    #if we don t want a recursive search we set the parameter maxdepth to 1 in order not to scan subdirs
    if [ $recursive = 0 ]
        then
        recursive=
        else
        recursive="-maxdepth 1"
    fi
    
    #finally we build the commands that will give us the results and execute them
    command_min="ls -la \`find "${toScan}" -type f "${recursive}"\` | awk '{print \$5,\$9}' | sort -n  | head -n 1 | awk '{print \"Smallest - Size: \", \$1, \" File:\", \$2}'"
    command_max="ls -la \`find "${toScan}" -type f "${recursive}"\` | awk '{print \$5,\$9}' | sort -nr | head -n 1 | awk '{print \"Largest  - Size: \", \$1, \" File:\", \$2}'"
    eval $command_min 
    eval $command_max
    
    • [^] # Re: Mon script, tadaaa

      Posté par  (site web personnel) . Évalué à 1.

      Oui, les commentaires sont en anglais, ce n'est pas du vulgaire plagiat, mais c'est juste que ma fac est à Melbourne (tiens, moi aussi d'ailleurs).
      Encore merci pour votre aide.
      Les commentaires sont les bienvenus :)
      • [^] # Re: Mon script, tadaaa

        Posté par  (site web personnel) . Évalué à 1.

        usage()
        {
        echo "Syntaxe: sizescan [-r] [-d directory]"
        }
        
        recursive="-maxdepth 1"
        toScan=`pwd`
        
        while getopts r:d opt
        do
                case $opt in
                    d)  toScan="$OPTARG"
        		if [ ! -d $toScan ];then
        			echo Provided directory doesn\'t exist!
            			exit 1; 
        		fi;;
        	    r)  recursive="";;
                     *)  usage; exit 1;;
                esac
        done
        
        Voilà mes méthodes de tests des variables... c'est plus court
  • # zsh

    Posté par  . Évalué à 1.

    avec zsh (si tu y as droit) :
    • echo "$PWD/"**/*(oL[1]) pour le plus petit fichier
    • echo "$PWD/"**/*(OL[1]) pour le plus gros

Suivre le flux des commentaires

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