[gull] Problèmes charactères MacOSX

Félix Hauri felix at f-hauri.ch
Sat Sep 11 19:16:02 CEST 2004


On Fri, Sep 10, 2004 at 05:10:35PM +0200, Daniel Cordey wrote:
> On Friday 10 September 2004 17:02, Daniel Cordey wrote:
> 
> > La commande 'find' peut extraire une arborescence. Voila, je modifie ton
> > script :
> 
> AIE................ STOP ..............

:->>

A propos, ce qui suit est transmi à titre indicatif!!!
Comme d'hab: L'auteur se décharge de toutes responsabilités quand aux
effets que l'application de ces proposition pourrait avoir sur vos données,
votre matériel, votre chien, votre femme etc.!!!

> J'ai oublie un truc important... 

Et ce n'est pas fini!

> #!/bin/sh
> find . -print |\
> while read path

Ça ne marche po:
[dumbname]$ echo coucou   > '?\[\]\\=+<>;:",|* -'\'
[dumbname]$ find . -print | while read path ; do cat "${path}" ; done
cat: ./?[]\=+<>;:",|* -': No such file or directory

> do
>     dir=$(dirname "${path}")
>     file=$(basename "${path}")
>     if [ ! -f "${path}" ]; then continue; fi
>     lc=$(echo "${file}" | tr '?\[\]/\\=+<>;:",|*'  '-')
T'as de la chance, cette deuxième erreur n'est pas plus grave que cela:
Le fichier doit s'appeler ``-nene'' ou dans le genre pour poser problème:
En principe, les commandes utilisent ``--'' pour signifier ``fin d'argument'',
$ file="-en"
$ echo "${file}"
$

$ echo -- "${file}"
-- -en
$

Je n'ai trouvé que printf pour nous sortir de cette situation:
$ printf "%s\n" "${file}"
-en

>     if [ ${lc} != "${file}" ]
>     then
>  newfile="${dir}/${lc}"
>  touch "${newfile}"
>  test $? = 0 && mv "${path}" "${newfile}"
>     fi
> done

Pour les commande ``mv'' et ``touch'', le ``--'' n'est pas nécessaire
puisque tu exprimes des chemins commencant par ``./'' (cf ``find .'').

Pour nous sortir du problème de parsing des noms de fichiers en bash,
il me semble que l'on doit oublier la comande find et créer une commande
``recursive'':

[dumbname]$ echo coucou1  > '?\[\]\\=+<>;:",|* -'\"
[dumbname]$ mkdir test\,\ 1
[dumbname]$ cd test\,\ 1/
[test, 1]$ echo coucou  > '?\[\]\\=+<>;:",|* -'\'
[test, 1]$ echo coucou1 > '?\[\]\\=+<>;:",|* -"'
[test, 1]$ echo coucou2 > '?\[\]\\=+<>;:",|* -:' 
[test, 1]$ echo coucou3 > '?\[\]\\=+<>;:",|* ->'
[test, 1]$ echo coucou4 > '?\[\]\\=+<>;:",|* -<'
[test, 1]$ echo Hi, there> ./-en
[test, 1]$ cd /tmp
[tmp]$ cat <<eoscript >dumbname.sh
#!/bin/sh

err() {
    echo >&2 $@
}

die() {
    err $@
    exit 1
}

preventdouble() {
    onam="$1"
    nnam=$( printf "%s" "$1" |
                tr ';:, =+<>?[]/\\=+<>"|*'\'  '..._____\----------')
    if [ " $nnam" != " $onam" ]
	then
	result="$nnam"
	if [ -f $result ]
	    then
	    list=("${nnam}_"*)
	    nnum=$((${#list[@]}+1))
	    result="${nnam}_$nnum"
	fi
	printf "%s" "$result"
    fi
}

cmdname="${0#.}"
[ "$cmdname" = "$0" ] || cmdname="$PWD/$cmdname"

[ "$1" ] || die "No directory specified"

[ -d "$1" ] || die "$1 is not a directory"

cd -- "$1" || die "Can't access directory: $1."

shopt -s nullglob
shopt -s dotglob
for direntry in *;do
    newnam=$(preventdouble "$direntry")
    if [ ! -z "$newnam" ]
	then
	[ -f "$newnam" ] &&
	     die "Broken rename in $PWD, with $direntry and $newnam."
	if touch -- "$newnam"
	    then
	    rm -- "$newnam"
	    mv -- "$direntry" "$newnam"
	else
	    err "Can't create: $newnam."
	    newnam="$direntry"
	fi
    fi
    [ -d "$newnam" ] && $cmdname "$newnam"
    done
eoscript

[tmp]$ chmod +x dumbname.sh
[tmp]$ /bin/ls -R dumpname/
dumbname/:
?\[\]\\=+<>;:",|* -'  ?\[\]\\=+<>;:",|* -"  test, 1

dumbname/test, 1:
?\[\]\\=+<>;:",|* -<  ?\[\]\\=+<>;:",|* -:  ?\[\]\\=+<>;:",|* -"
?\[\]\\=+<>;:",|* ->  ?\[\]\\=+<>;:",|* -'  -en

[tmp]$ ./dumbname.sh dumbname
[tmp]$ /bin/ls -R dumbname
dumbname:
-----------..-.--_--  -----------..-.--_--_1  test._1

dumbname/test._1:
-----------..-.--_--  -----------..-.--_--_1  -----------..-.--_--_3
-----------..-.--_-.  -----------..-.--_--_2  -en

Et voilà.
Avec encore nullglob pour les répertoires vides et dotglob pour les
entrées commençant par ``.'', je crois que j'ai fait le tour...

Je vous laisse apprécier la méthode de comptage des doublons.
  list=("${nnam}_"*) ; nnum=$((${#list[@]}+1))

-- 
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch



More information about the gull mailing list