# Renommage de fichiers à grande échelle



## Arthas (30 Septembre 2004)

Bonjour à toute la communauté Mac !

Existe t-il une commande shell simple et rapide permettant de renommer en minuscules TOUS les fichiers et répertoires d'un répertoire donné et de ses sous répertoires ?
Merci d'avance pour vos réponses !

Arthas


----------



## flakk (30 Septembre 2004)

hello,

pour ce genre de chose, y'a find et mv...
(pas de commande std qui le fasse direct à ma conaissance.)

place toi dans le répertoire à modifier et fais un truc du genre :
find -type f|while read f; do x=`echo $f|tr [:upper:] [:lower:]`; mv $f $x; done

ca mettra en lowercase tous les fichiers contenu dans le rep en question.
ensuite tu peux ajouter quelques subtilités, quelques tests avant le mv, et mettre le tout dans un script, etc...

par contre, faut faire très attention avec ce genre de traitement quand il n'y a pas bcp de vérifications et de tests...
typiquement, avec l'exemple que je t'ai donné, si dans le même repertoire tu as Monfichier, MonFichier et monfichier, au final tu n'en aura plus qu'un appelé monfichier, les 2 autres seront écrasés...
(cet exemple est idiot puisqu'il suffirait de mettre l'option -n après le mv pour no overwrite)
bref.. prudence


----------



## flakk (30 Septembre 2004)

bon tu voulais simple et rapide.. je ne sais pas si ca va te convenir.. 
si tu connais pas trop le shell, ca peux paraitre assez abscon 

si ca ne te plais vraiment pas, il doit exister des executables qui font ca direct, 
mais l'avantage de savoir se servir des trucs basiques c'est qu'après, tu peux presque tout faire avec sans chercher 3 siècles pour trouver un outil super spécifique qui ne te servira qu'une fois dans ta vie.

(mais malgré tout.. si quelqu'un connais une cmd tout-en-un présente nativement et qui fasse ça.. je suis preneur  )


----------



## monoeil (30 Septembre 2004)

Slt.
Rien à voir avec une quelconque commande shell via le terminal. Néanmoins, il me semble que l'un des scripts inclus dans l'OS 10.2.8 pourrait résoudre facilement ton problème

Le chemin est : Disque Dur > Biblithèque(Library) > Scripts.
De mémoire, il s'intitule à peu près "Lower case in item names" et est rangé dans le sous-dossier "Finder Scripts".
Sélectionne ton dossier contenant tes fichiers, puis lance le script.


----------



## Arthas (30 Septembre 2004)

Salut Flakk,

Merci pour ton aide, mais effectivement, les commandes Unix ne sont pas mon fort (il va falloir que je m'y mette un jour   ) et celle que tu me présentes est déjà un peu trop complexe à mon goût.
J'ai en revanche essayer en PHP et j'arrive à changer en lowercase la totalité du contenu de la racine d'un répertoire donné mais pas des sous-répertoires ?

Connais-tu PHP ? Si oui, peut-être peux-tu m'aider ?

Merci


----------



## Arthas (30 Septembre 2004)

Salut monoeil,

Pourquoi se prendre la tête à chercher des commandes super complexes, alors que l'on a tout sous la main bien caché dans notre Mac préféré !?!?!?

Merci pour ton aide, en revanche, il semble que le script n'agit qu'à la racine du répertoire dans lequel il est placé, impossible d'effectuer la même commande dans la totalité des sous-répertoires de ce même répertoire. C'est bien dommage !

A moins que tu ne saches comment modifier l'Applescript d'origine ?

Merci


----------



## monoeil (1 Octobre 2004)

Euh, en cherchant, je pourrais te répondre car c'est possible. Il suffirait de copier ce script et d'y insérer le code adéquat. Seulement, de mémoire mes éventuelles indications risquent de n'être pas être très efficientes. Si tu peux attendre, je te dirai ça.

Autre truc, si tu compte user de ces scripts souvent, il est possible d'inclure un raccourci de ce dossier script dans la barre des menu du Finder. Mais là aussi ma mémoire flanche.

Dans l'état, c'est sûr ça ne mérite peut-être pas un coup de boule complet...


----------



## tatouille (1 Octobre 2004)

Arthas a dit:
			
		

> Salut Flakk,
> 
> Merci pour ton aide, mais effectivement, les commandes Unix ne sont pas mon fort (il va falloir que je m'y mette un jour   ) et celle que tu me présentes est déjà un peu trop complexe à mon goût.
> J'ai en revanche essayer en PHP et j'arrive à changer en lowercase la totalité du contenu de la racine d'un répertoire donné mais pas des sous-répertoires ?
> ...



je te conseille de faire ca en bash c'est mieux si tu as à faire un traitement recursif,
et c'est fait pour ca en autre le bash (comme tout les shells qui sont là pour naviguer (sur) et modifier le filesystem)


```
#!/bin/sh

#Tatouille example (c)

for libs in `ls -R /usr/lib | grep dylib`;do
	if ! test -L /usr/lib/$libs ;then
		
		unameLib=`(echo $libs | sed -n -e "s/^lib//g" -n -e "s/\..*//p")`
		versionLib=`(echo $libs | sed -n -e "s/^lib$unameLib\.//g" -n -e "s/\.dylib//p")`
		nameLib=$(echo $unameLib | cut -c 1 | tr a-z A-Z)$(echo $unameLib | sed 's/^.//')_Lib
		
		echo $nameLib "------" $versionLib "------" $unameLib
	fi
done
```


----------



## flakk (1 Octobre 2004)

huhu tartouille 
je suis pas sur que ton script en exemple réussisse à le convaincre si déja la ligne que j'avais mis lui fait peur.

mais ceci dit, entièrement d'accord... faire ca autrement qu'en shell... c'est c'est presque un non-sens... (en php, on peut même enlever le "presque" de la phrase précédente  )

et au risque de me répéter, si ca peu paraitre compliqué de prime abord.. ca ne l'est pas... et l'investissement en temps pour s'y mettre n'est rien comparé au gain de temps que ca apporte quotidienneement. 
on a un OS digne de ce nom avec les outils adéquats.. profitons en !!


----------



## tatouille (1 Octobre 2004)

flakk a dit:
			
		

> huhu tartouille
> je suis pas sur que ton script en exemple réussisse à le convaincre si déja la ligne que j'avais mis lui fait peur.
> 
> mais ceci dit, entièrement d'accord... faire ca autrement qu'en shell... c'est c'est presque un non-sens... (en php, on peut même enlever le "presque" de la phrase précédente  )
> ...



soyons bourrins mes frères

mise à part ca je donne à peu près tous les outils dont il va avoir besoin 
pour faire ce renommage

je pourrais donner l'exemple en php qui me prendra plus de lignes meme en utilisant cli
et pear system


----------



## Arthas (6 Octobre 2004)

Salut tatouille,

Merci pour ton précedent message mais vraiment, là, je n'y comprend rien !
J'ai essayé en PHP et cela fonctionne mais au sein d'un répertoire seulement pas dans les sous-répertoires. Comment inclure la récursivité de cette fonction dans le script suivant :

$dir = "mon_repertoire";
if (is_dir($dir)) {
	$files = array();
	$ouverture = opendir($dir);
	while (($file = readdir($ouverture)) !== FALSE) {
		if ($file !== "." && $file !== ".." && $file !== ".DS_Store") {
			array_push($files, $file);
		}
	}
	foreach ($files as $file) {
		rename($dir . "/" . $file, strtolower($dir . "/" . $file));
	}
}

As-tu une idée ?

Merci


----------



## bompi (7 Octobre 2004)

Avec PHP, tu peux créer des fonctions. Il te suffit d'en créer une récursive et hop !
Tu prends le code ci-dessus, tu le mets dans une fonction (appelons-la 'lowerDir')
qui prend un répertoire à traiter en paramètre.
Dans cette fonction tu testes si un fichier est un répertoire et si oui, tu appelles
cette-même fonction en lui passant ce répertoire en paramètre.


----------



## aranaud (19 Février 2005)

Une petite application cocoa pour ne pas se prendre la tête avec le terminale.

change extension (72,9Ko)


----------



## tatouille (26 Février 2005)

rigolo mais un file chooser c'est du luxe  
et une nsview en plus pour éviter 
que cela se barre ds tous les sens  

huhu

```
#!/bin/bash

# {{{ Config
    
    # Bundle 
    AppPath="/home/elm/www"
    workspace="$AppPath/resources/workspace/$(date +%Y%m%d)"
    BundlePath="$AppPath/bundles/PopulateDB.bundle"
    RegateFile="$AppPath/resources/receipt/eqnaaa30.txt"
    mysqlbindir="/usr/local/mysql/bin"
    SplitNumRow="40000"

    # MySQL
    DB="lpmf_import"
    DB_USER="root"
    DB_PASS=""
    db_B_tbl=$DB".import_B"
    db_C_tbl=$DB".import_C"
    db_P_tbl=$DB".import_P"
    db_Entity_tbl=$DB".import_entity"

    # Files
    BFile="B.txt"
    CFile="C.txt"
    PFile="P.txt"
    RFile="R.txt"
    PXFile="PX.txt"
    pXrFile="Pfinal.txt"
    
# }}}

# {{{ Function

isRoot ()
{
    #
    # Root privileges
    #
    ROOT_UID=0
    ROOTUSER_NAME=root
    E_WRONG_USER=403
    username=`id -nu`
    
    if [ "$UID" -ne "$ROOT_UID" ]
    then
        consolMessage "You must be root to run this script."
        exit $E_WRONG_USER
    fi
    
    if [ "$username" != "$ROOTUSER_NAME" ]
    then
        consolMessage "You must be root to run \"`basename $0`\"."
        exit $E_WRONG_USER
    fi
}

consolMessage ()
{
    #
    # Print a Message
    #
    echo "$1"
    echo "..............................................................................."
}

initWorkspace ()
{
    #
    # init workspace folders
    #
    consolMessage ""
    
    mkdir -p $1
    rm -fR "$1"
    mkdir -p $1/data
    rm -fR "$1/data"
    mkdir -p $1/data
    mkdir -p $1/pivot
    rm -fR "$1/pivot"
    mkdir -p $1/pivot
    chmod -R 777 $1
}

extractB ()
{
    #
    # Reading the regate file and 
    # extract the index of Properties
    #
    consolMessage " Reading the regate file, creating the File $1"

    grep -e '^B;' $3 | cut -d ';' -f2,3,4,5,1,6 | sort -k3 -t';' -T /tmp > $2

    consolMessage " >>> Done"
}

extractC ()
{
    #
    # Reading the regate file and 
    # extract the index of Headings
    #
    consolMessage " Reading the regate file, creating the File $1"

    grep -e '^C;' $3 | cut -d ';' -f2,3,4,5,1,6 | sort -k3 -t';' -T /tmp  > $2

    consolMessage " >>> Done"
}

extractP ()
{
    #
    # Reading the regate file and 
    # extract the content of Properties and  Headings
    #
    consolMessage " Reading the regate file, creating (sorting by Rcode,Pcode) the File $1"

   grep -e '^P;' $3 | cut -d ';' -f1,2,3,4,5 | sort -k3,4 -t';' -T /tmp > $2

    consolMessage " >>> Done"
}

splitP ()
{
    #
    # Splitting the previous content file
    #
    consolMessage " Reading the regate file in memory, splitting (every $3 rows) the file $1"

    (cd $2 && split -l$3 ../$1)
    CountItem=`ls $2 |wc -l`
    
    consolMessage " >>> Done"
}

Btable ()
{
    #
    # Populating DB  creating, populating, Properties table  import_B
    #
    consolMessage " Populating DB : $DB, creating, populating $db_B_tbl with $BFile"

    sql="use $DB; \
        drop table if exists $db_B_tbl; \
        create table if not exists $db_B_tbl (     \
        B1 varchar(1) character set utf8 collate utf8_unicode_ci not null ,   \
        B2 varchar(1) character set utf8 collate utf8_unicode_ci not null ,   \
        B3 varchar(5) character set utf8 collate utf8_unicode_ci not null ,   \
        B4 varchar(1) character set utf8 collate utf8_unicode_ci not null ,    \
        B5 varchar(4) character set utf8 collate utf8_unicode_ci not null,      \
        B6 varchar(54) character set utf8 collate utf8_unicode_ci not null,      \
        PRIMARY KEY  (B3),  \
        KEY B1 (B1,B2,B3,B4,B5,B6)   \
        )engine=MyISAM default charset=utf8 collate=utf8_unicode_ci;"
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch -N -e "$sql"
    
    FileName=$workspace/$BFile;
    sql="use $DB;load data infile '$FileName' into table $db_B_tbl fields terminated by ';' lines terminated by '\n'"
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch -N -e "$sql"
    
    consolMessage " >>> Done"
}

Ctable ()
{
    #
    # Populating DB  creating, populating, Headings table import_C
    #
    consolMessage " Populating DB : $DB, creating, populating $db_C_tbl with $CFile"
    
    sql="use $DB; \
        drop table if exists $db_C_tbl; \
        create table if not exists $db_C_tbl (     \
        C1 varchar(1) character set utf8 collate utf8_unicode_ci not null ,   \
        C2 varchar(1) character set utf8 collate utf8_unicode_ci not null ,   \
        C3 varchar(5) character set utf8 collate utf8_unicode_ci not null ,   \
        C4 varchar(1) character set utf8 collate utf8_unicode_ci not null ,    \
        C5 varchar(4) character set utf8 collate utf8_unicode_ci not null,      \
        C6 varchar(54) character set utf8 collate utf8_unicode_ci not null,      \
        PRIMARY KEY  (C3),  \
        KEY C1 (C1,C2,C3,C4,C5,C6)   \
        )engine=MyISAM default charset=utf8 collate=utf8_unicode_ci;"
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch -N -e "$sql"
    
    FileName=$workspace/$CFile;
    sql="use $DB;load data infile '$FileName' into table $db_C_tbl fields terminated by ';' lines terminated by '\n'"
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch -N -e "$sql"
    
    consolMessage " >>> Done"
}

Ptable ()
{
    #
    # Populating DB  creating, populating, Content table  import_p
    #
    consolMessage " Populating DB : $DB, creating, populating $db_P_tbl with the split of $PFile"
    
    sql="use $DB; \
        drop table if exists $db_P_tbl; \
        create table if not exists $db_P_tbl (     \
        P1 varchar(1) character set utf8 collate utf8_unicode_ci not null ,   \
        P2 varchar(1) character set utf8 collate utf8_unicode_ci not null ,   \
        P3 varchar(6) character set utf8 collate utf8_unicode_ci not null ,   \
        P4 varchar(5) character set utf8 collate utf8_unicode_ci not null ,    \
        P5 varchar(255) character set utf8 collate utf8_unicode_ci not null   \
        )engine=MyISAM default charset=utf8 collate=utf8_unicode_ci;"
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch -N -e "$sql"
    
    sql="use $DB;"
    
    for P_file in `ls $workspace/data | grep -e '[a-z]'`
    do
        FileName=$workspace/data/$P_file
        sql="$sql load data infile '$FileName' into table $db_P_tbl fields terminated by ';' lines terminated by '\n';"   
    done
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch -N -e "$sql"
    
    consolMessage " >>> Done"
}
```


----------



## tatouille (26 Février 2005)

la suite huhuhuhu   


```
extractRID ()
{
    #
    # Extracting the REGATEID from import_P 
    #
    consolMessage " Transpose task, getting Regate ID from $db_P_tbl"
    
    pRIDFile="$RFile"
    
    if [ -f $workspace/$pRIDFile ]
    then
        rm -f $workspace/$pRIDFile
    fi

    sql="use $DB;
    SELECT P3
    INTO OUTFILE '$workspace/$pRIDFile'  
    FIELDS TERMINATED BY ';'  
    LINES TERMINATED BY '\n'
    FROM import_P
    GROUP BY P3;"
 
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch -N -e "$sql"

    pRIDNum=`cat $workspace/$pRIDFile |wc -l`
    consolMessage " >>> Done"
}

extractPref ()
{
    
    #
    # Extracting the references to catch from P_ref table
    #
    consolMessage " Transpose task, extract pivot"
    
    if [ -f $workspace/$PXFile ]
    then
        rm -f $workspace/$PXFile
    fi
    
    sql="use $DB; \
    SELECT \
    p_ref.code, \
    p_ref.col,p_ref.colfieldtype,p_ref.coldfielddefault,p_ref.coldfieldlength \
    INTO OUTFILE '$workspace/$PXFile' \
    FIELDS TERMINATED BY ';' \
    LINES TERMINATED BY '\n'   \
    FROM p_ref \
    WHERE p_ref.state =1   \
    ORDER BY p_ref.colpos;"
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch  -N -e "$sql"
    
    consolMessage " >>> Done"
}

storePref ()
{
    #
    # Storing the results of  extractPref () into arrays
    #
    consolMessage " Transpose task, storing $PXFile into arrays"

    i=1
    
    #Parr Properties Array 
    
    while read -r
    do
        fieldName[$i]=$(echo $REPLY | awk -F ";" '{print $2}')
        fieldType[$i]=$(echo $REPLY | awk -F ";" '{print $3}')
        fieldDefault[$i]=$(echo $REPLY | awk -F ";" '{print $4}')
        fieldLength[$i]=$(echo $REPLY | awk -F ";" '{print $5}')
        Parr[$i]=$(echo $REPLY | awk -F ";" '{print $1}')
        
        let  i=$i+1
        let  j=$i-1
    done <$workspace/$PXFile

    consolMessage " >>> Done"
}

explodeRID ()
{
    #
    # Splitting REGATE File every regateid
    #
    consolMessage " Transpose task, splitting $RegateFile in folder $workspace/pivot (foreach regateid stored in $pRIDFile)"    

    if [ -f $workspace/$pXrFile ]
    then
        rm -f $workspace/$pXrFile
    fi
    
    wf=1
    while read -r
    do
        grep -e "^P\;[A-Z]\{1\}\;${REPLY}\;" $workspace/$PFile > $workspace/pivot/${REPLY}.txt
        echo " --- writing file Entity : ${REPLY}.txt --- $wf/$pRIDNum --- "
        let wf=$wf+1
        
    done <$workspace/$pRIDFile    

    consolMessage " >>> Done"
}

transEntity ()
{
    #
    # Creating the transposed file
    #
    consolMessage " Transpose task, creating the transposed file"
    
    rw=1
    while read -r
    do 
    RID="$REPLY"    
    rowVal=""

        for (( m=1 ; m <= $j ; m++ ))
        do
                row=$(grep -e "^P\;[A-Z]\{1\}\;${RID}\;${Parr[$m]}\;" $workspace/pivot/${RID}.txt)
                
                if [ "${row}" = "" ]
                then
                    line="P;M;${RID};${Parr[$m]};${fieldDefault[$m]}"
                else
                    if [ "$(echo ${row} | awk -F ";" '{print $5}')" = "" ]
                    then
                        line="P;M;${RID};${Parr[$m]};${fieldDefault[$m]}"
                    else
                        line="${row}"
                    fi
                fi
                
                if [ $m = 1 ]
                then
                    rowVal="${RID};$(echo ${line} | awk -F ";" '{print $5}')"
                else
                    rowVal="${rowVal};$(echo ${line} | awk -F ";" '{print $5}')"
                fi
        done
        echo " --- writing row ${rw} Entity : ${RID} - Items : ${m} --- "
        echo $rowVal   >>$workspace/$pXrFile
    
        let rw=$rw+1

    done <$workspace/$pRIDFile 
    
    consolMessage " >>> Done"
}

EntityTable ()
{
    #
    # Creating, populating import entity table
    #
    consolMessage " Transpose task, creating, populating $db_Entity_tbl"
   
    sql="use $DB; \
    DROP TABLE IF EXISTS $db_Entity_tbl; \
    CREATE TABLE $db_Entity_tbl (
    REGATEID varchar(6) collate utf8_unicode_ci NOT NULL default ''"
   
    for (( m=1 ; m <= $j ; m++ ))
    do
        
        if [ "${fieldType[$m]}" = "varchar" ]
        then
            sql="$sql,${fieldName[$m]} ${fieldType[$m]}(${fieldLength[$m]}) collate utf8_unicode_ci NOT NULL default '${fieldDefault[$m]}'"
        
        elif [ "${fieldType[$m]}" = "date" ]
        then
            sql="$sql,${fieldName[$m]} ${fieldType[$m]} NOT NULL default '${fieldDefault[$m]}'"  
        fi
    done
    
    sql="$sql  \
    ,PRIMARY KEY(REGATEID)  \
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"
    
    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch  -N -e "$sql"

    FileName=$workspace/$pXrFile
    sql="use $DB;"
    sql="$sql load data infile '$FileName' into table $db_Entity_tbl fields terminated by ';' lines terminated by '\n';"

    $mysqlbindir/mysql --user=$DB_USER --password=$DB_PASS --batch  -N -e "$sql"

    consolMessage " >>> Done"
}

# }}}

#----------------------------------------------------------------------------------------------------------------------
# Root privileges
isRoot
clear
#
#----------------------------------------------------------------------------------------------------------------------


#----------------------------------------------------------------------------------------------------------------------
# First step
#----------------------------------------------------------------------------------------------------------------------

# Init workspace
initWorkspace "$workspace"

# Reading the regate file and extract the index of Properties
extractB  "$BFile" "$workspace/$BFile"  "$RegateFile"

# Reading the regate file and extract the index of Headings
extractC  "$CFile" "$workspace/$CFile" "$RegateFile"

# Reading the regate file and extract the content of Properties and  Headings
extractP "$PFile" "$workspace/$PFile" "$RegateFile"

# Spliting the previous content file
splitP "$PFile" "$workspace/data" "$SplitNumRow"

#----------------------------------------------------------------------------------------------------------------------
# End of first step
#----------------------------------------------------------------------------------------------------------------------


#----------------------------------------------------------------------------------------------------------------------
clear
consolMessage "Script Execution time : $SECONDS sec, $CountItem items"
#----------------------------------------------------------------------------------------------------------------------


#----------------------------------------------------------------------------------------------------------------------
# Second step
#----------------------------------------------------------------------------------------------------------------------

# Creating, populating, Properties table
Btable

# Creating, populating, Headings table
Ctable

# creating, populating, Content table
Ptable

#----------------------------------------------------------------------------------------------------------------------
# End of second step
#----------------------------------------------------------------------------------------------------------------------


#----------------------------------------------------------------------------------------------------------------------
clear
consolMessage " Script Execution time : $SECONDS sec"
#----------------------------------------------------------------------------------------------------------------------


#----------------------------------------------------------------------------------------------------------------------
# Third step
#----------------------------------------------------------------------------------------------------------------------

# Extracting all REGATEID
extractRID

# Extracting properties to catch
extractPref

# Storing the results of  extractPref () into arrays
declare -a fieldName    #Columns
declare -a fieldType     #Types (varchar,int,date ... )
declare -a fieldDefault #Default Values
declare -a fieldLength #Lengths
declare -a Parr #Codes
j=0  #Number of selected properties

storePref

# Splitting REGATE File ( every regate id stored into RID.txt )
explodeRID

# Creating the transposed file
transEntity

# Creating, populating import_entity table
EntityTable

#----------------------------------------------------------------------------------------------------------------------
# End third step
#----------------------------------------------------------------------------------------------------------------------


#----------------------------------------------------------------------------------------------------------------------
clear
consolMessage " Script Execution time : $SECONDS sec"
consolMessage " Import finished"
#----------------------------------------------------------------------------------------------------------------------

exit 0
```


pour finir ca traite un gros fichier d'export de db(la poste :que des branlosses)  (fichier à plat 68 MEG)
ca le parse et ca en retire une transpose nettoyée afin de mettre à jour une autre DB
par comparaison 

Temps de traitement 32 minutes pour la remonté de la transpose brute


----------

