[SHELL] Script renommage Unix

Bonjour,

J'essaye de renommer les fichiers d'un répertoire de la manière suivante :

		for fichier in *
		do
			if [ -f $fichier ]; then
				mv $file $pref$file
			fi
		done


Seulement, ça peut marcher uniquement si mon script se trouve dans le repertoire des fichiers à renommer.

Y'aurait il une solution pour pouvoir lancer un tel script depuis n'importe quel repertoire ?

Merci d'avance.
Configuration: Windows XP
Firefox 2.0.0.6

6 réponses

  1. Modérateur
    Salut,

    Tu peux par exemple :
    #! /bin/bash
    
    cd "$1"
    
    for fichier in *
    do
    if [ -f $fichier ]; then
    mv $file $pref$file
    fi
    done 
    en lançant ton script avec le chemin absolu vers ton répertoire en paramètre...

    ;-))
    0
    1. #! /bin/bash

      # si pas d'arguments
      if [ $# -le 0 ]
      then
      echo "usage : renommer.sh <repertoires>
      exit 1
      fi

      # repertoire de depart pour gerer les cas de noms relatifs de repertoires cibles
      start="$PWD"

      # pour traiter les fichiers avec des espaces, on change l'IFS, attention a ne pas utiliser ce caractere
      # dans le script, sinon, changer l'IFS.
      # Normalement ce caractere n'est pas utilise pour les nom de fichiers,
      # sinon, changer l'IFS
      IFS='¤'

      # fonction de renommage
      # en entree le nom du fichier, en sortie (standard) son nouveau nom
      function rename_file
      {
      local pref="monprefixe_"
      echo "$pref$1"
      }

      # parcours de la liste des repertoires en entree
      while [ $# -gt 0 ]
      do
      # descente dans le repertoire en entree
      if cd "$1"
      then
      # pour chaque fichier
      for file in *
      do
      mv "$file" "$(rename_file "$1")"
      done

      # retour repertoire de depart
      cd "start"
      fi

      # passage au repertoire en entree suivant
      shift
      done
      0
      1. il manque un guillement double apres echo "usage : renommer.sh <repertoires>
        mes excuses
        0
        1. Merci pour vos réponses.
          Il n'y a donc pas de solution sans avoir à faire un "cd" ?
          0
          1. Modérateur
            Salut,

            oui, il y a :-)

            root@debian:~# cat ccm.sh
            #!/bin/bash
            
            rep=$1
            
            for fichier in $1/*
            do
            if [ -f $fichier ]; then
            mv $fichier "$fichier.bak"
            fi
            done
            root@debian:~# pwd
            /home/lami20j
            root@debian:~# ls /home/lami20j/trash/
            fic1.txt  fic2.txt
            root@debian:~# sh ccm.sh /home/lami20j/trash
            root@debian:~# ls /home/lami20j/trash/
            fic1.txt.bak  fic2.txt.bak

            0