ici même:1gn52xd.y7mh8x18t1w96N%, Jérôme Laurens a écrit
Salut,
des fois on a l'impression d'être bête
comment récupérer dans un script bash le fichier pointé par un soft link?
MDA
file toto
-- dominix -<
Nicolas George
Pascal Bourguignon wrote in message :
Voir: ls -ld $link ou find $link -ls
Ce qui veut dire parser la sortie de ls, ce qui n'est pas terrible. C'est un peu capilotracté, mais on _peut_ se retrouver dans une situation de ce genre :
lrwxrwxrwx 1 cigaes cigaes 10 Nov 13 21:19 foo -> bar -> baz lrwxrwxrwx 1 cigaes cigaes 3 Nov 13 21:19 foo -> bar -> baz -rw-r--r-- 1 cigaes cigaes 0 Nov 13 21:19 foo -> bar -> baz
Le premier est un lien « foo » vers un fichier « bar -> baz », le second est un lien « foo -> bar » vers « baz », le dernier est un fichier simple avec un nom pénible.
GNU comporte la commande readlink, mais elle n'est pas standard Unix. Donc selon les exigences de portabilité, ça peut être à considérer. Sinon, il y a toujours perl : la fonction readlink.
L'information que tu cherches est enregistrée dans le répertoire, c'est donc avec des outils lisant les répertoires que tu peux l'obtenir!
C'est plutôt dans l'inode que c'est stocké, en général, il me semble.
Pascal Bourguignon wrote in message
<878y95d9ds.fsf@thalassa.informatimago.com>:
Voir:
ls -ld $link
ou
find $link -ls
Ce qui veut dire parser la sortie de ls, ce qui n'est pas terrible. C'est un
peu capilotracté, mais on _peut_ se retrouver dans une situation de ce
genre :
lrwxrwxrwx 1 cigaes cigaes 10 Nov 13 21:19 foo -> bar -> baz
lrwxrwxrwx 1 cigaes cigaes 3 Nov 13 21:19 foo -> bar -> baz
-rw-r--r-- 1 cigaes cigaes 0 Nov 13 21:19 foo -> bar -> baz
Le premier est un lien « foo » vers un fichier « bar -> baz », le second est
un lien « foo -> bar » vers « baz », le dernier est un fichier simple avec
un nom pénible.
GNU comporte la commande readlink, mais elle n'est pas standard Unix. Donc
selon les exigences de portabilité, ça peut être à considérer. Sinon, il y a
toujours perl : la fonction readlink.
L'information que tu cherches est enregistrée dans le répertoire, c'est
donc avec des outils lisant les répertoires que tu peux l'obtenir!
C'est plutôt dans l'inode que c'est stocké, en général, il me semble.
Ce qui veut dire parser la sortie de ls, ce qui n'est pas terrible. C'est un peu capilotracté, mais on _peut_ se retrouver dans une situation de ce genre :
lrwxrwxrwx 1 cigaes cigaes 10 Nov 13 21:19 foo -> bar -> baz lrwxrwxrwx 1 cigaes cigaes 3 Nov 13 21:19 foo -> bar -> baz -rw-r--r-- 1 cigaes cigaes 0 Nov 13 21:19 foo -> bar -> baz
Le premier est un lien « foo » vers un fichier « bar -> baz », le second est un lien « foo -> bar » vers « baz », le dernier est un fichier simple avec un nom pénible.
GNU comporte la commande readlink, mais elle n'est pas standard Unix. Donc selon les exigences de portabilité, ça peut être à considérer. Sinon, il y a toujours perl : la fonction readlink.
L'information que tu cherches est enregistrée dans le répertoire, c'est donc avec des outils lisant les répertoires que tu peux l'obtenir!
C'est plutôt dans l'inode que c'est stocké, en général, il me semble.
Stephane Chazelas
2004-11-13, 17:03(+01), Pascal Bourguignon:
(Jérôme Laurens) writes:
des fois on a l'impression d'être bête
comment récupérer dans un script bash le fichier pointé par un soft link?
Voir: ls -ld $link ou find $link -ls
L'information que tu cherches est enregistrée dans le répertoire, c'est donc avec des outils lisant les répertoires que tu peux l'obtenir! [...]
?
Le chemin du fichier pointé par un symlink est stocké dans l'inode du symlink, il faut donc utiliser stat(2). De quel repertoire parles-tu ?
comment récupérer dans un script bash le fichier pointé par un soft link?
Sur une de mes machines j'ai la commande 'readlink'. une commande GNU du paquetage coreutils...
Cyrille Lefevre
"Jérôme Laurens" a écrit dans le message de news:1gn52xd.y7mh8x18t1w96N%
comment récupérer dans un script bash le fichier pointé par un soft link?
http://groups.google.fr/groups?q=%2Bcyrille+%2Blefevre+%2Bgetabsolutepath&hl=fr&lr Cyrille Lefevre. -- home: mailto:cyrille.lefevre% | UNIX is user-friendly work: disponible sur le marche du travail ;-P | it's just particular Supprimer "%no-spam" et ".invalid" pour me repondre. | about who it chooses Remove "%no-spam" and ".invalid" to answer me back. | to be friends with.
"Jérôme Laurens" <jlaurens@users.sourceforge.net> a écrit dans le message de
news:1gn52xd.y7mh8x18t1w96N%jlaurens@users.sourceforge.net...
comment récupérer dans un script bash le fichier pointé par un soft
link?
http://groups.google.fr/groups?q=%2Bcyrille+%2Blefevre+%2Bgetabsolutepath&hl=fr&lr
Cyrille Lefevre.
--
home: mailto:cyrille.lefevre%no-spam@laposte.net.invalid | UNIX is user-friendly
work: disponible sur le marche du travail ;-P | it's just particular
Supprimer "%no-spam" et ".invalid" pour me repondre. | about who it chooses
Remove "%no-spam" and ".invalid" to answer me back. | to be friends with.
"Jérôme Laurens" a écrit dans le message de news:1gn52xd.y7mh8x18t1w96N%
comment récupérer dans un script bash le fichier pointé par un soft link?
http://groups.google.fr/groups?q=%2Bcyrille+%2Blefevre+%2Bgetabsolutepath&hl=fr&lr Cyrille Lefevre. -- home: mailto:cyrille.lefevre% | UNIX is user-friendly work: disponible sur le marche du travail ;-P | it's just particular Supprimer "%no-spam" et ".invalid" pour me repondre. | about who it chooses Remove "%no-spam" and ".invalid" to answer me back. | to be friends with.
Stephane Chazelas
2004-11-13, 16:45(+01), Jérôme Laurens: [...]
comment récupérer dans un script bash le fichier pointé par un soft link? [...]
Sur un system GNU, utiliser GNU find, sinon, utiliser perl ou zsh (des fois on peut trouver une commande readlink). On pourrait eventuellement utiliser ls -l mais pas de maniere fiable en toute circonstance.
Pour resoudre un lien sympolique jusqu'a trouver un fichier qui ne soit plus un lien:
get_real_path() { ( file=$1 loops=0 while case $file in *[!/]/*) cd -P -- "${file%/*}" || return;; /*) cd / || return;; esac [ -L "$file" ] do loops=$(($loops + 1)) if [ "$n" -gt 40 ]; then echo >&2 "Too many symlinks" return 1 fi case $file in -*) file=./$file;; esac file=$(find "$file" -prune -printf '%l.') || return file=${file%.} done if [ -d "$file" ]; then cd -P -- "$file" && pwd -P else dir=$(pwd -P && echo .) || return dir=${dir%??} case $dir in /) printf '%sn' "/${file##*/}";; *) printf '%sn' "$dir/${file##*/}";; esac fi ) }
-- Stephane
2004-11-13, 16:45(+01), Jérôme Laurens:
[...]
comment récupérer dans un script bash le fichier pointé par un soft
link?
[...]
Sur un system GNU, utiliser GNU find, sinon, utiliser perl ou
zsh (des fois on peut trouver une commande readlink). On
pourrait eventuellement utiliser ls -l mais pas de maniere
fiable en toute circonstance.
Pour resoudre un lien sympolique jusqu'a trouver un fichier qui
ne soit plus un lien:
get_real_path() {
(
file=$1 loops=0
while
case $file in
*[!/]/*) cd -P -- "${file%/*}" || return;;
/*) cd / || return;;
esac
[ -L "$file" ]
do
loops=$(($loops + 1))
if [ "$n" -gt 40 ]; then
echo >&2 "Too many symlinks"
return 1
fi
case $file in
-*) file=./$file;;
esac
file=$(find "$file" -prune -printf '%l.') || return
file=${file%.}
done
if [ -d "$file" ]; then
cd -P -- "$file" && pwd -P
else
dir=$(pwd -P && echo .) || return
dir=${dir%??}
case $dir in
/) printf '%sn' "/${file##*/}";;
*) printf '%sn' "$dir/${file##*/}";;
esac
fi
)
}
comment récupérer dans un script bash le fichier pointé par un soft link? [...]
Sur un system GNU, utiliser GNU find, sinon, utiliser perl ou zsh (des fois on peut trouver une commande readlink). On pourrait eventuellement utiliser ls -l mais pas de maniere fiable en toute circonstance.
Pour resoudre un lien sympolique jusqu'a trouver un fichier qui ne soit plus un lien:
get_real_path() { ( file=$1 loops=0 while case $file in *[!/]/*) cd -P -- "${file%/*}" || return;; /*) cd / || return;; esac [ -L "$file" ] do loops=$(($loops + 1)) if [ "$n" -gt 40 ]; then echo >&2 "Too many symlinks" return 1 fi case $file in -*) file=./$file;; esac file=$(find "$file" -prune -printf '%l.') || return file=${file%.} done if [ -d "$file" ]; then cd -P -- "$file" && pwd -P else dir=$(pwd -P && echo .) || return dir=${dir%??} case $dir in /) printf '%sn' "/${file##*/}";; *) printf '%sn' "$dir/${file##*/}";; esac fi ) }
-- Stephane
Nicolas George
Stephane Chazelas wrote in message :
Sur un system GNU, utiliser GNU find, sinon, utiliser perl ou zsh (des fois on peut trouver une commande readlink).
Sur un système GNU, on a readlink, ce serait bête de s'embêter avec find.
Stephane Chazelas wrote in message
<slrncq9372.4jg.stephane.chazelas@spam.is.invalid>:
Sur un system GNU, utiliser GNU find, sinon, utiliser perl ou
zsh (des fois on peut trouver une commande readlink).
Sur un système GNU, on a readlink, ce serait bête de s'embêter avec find.