[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