Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/11/2008, à 11:58

congelli501

[bash] Dernier champs du chemin d'un dossier

Bonjour,
Je souhaiterais extraire le dernier champs d'un nom de dossier, en bash.
La commande devrais ressembler à :

fileName=`pwd | cut -d "/" -f 'n° du dernier champs'`

Quelqu'un peut-il m'aider ?
Merci d'avance !:D

Hors ligne

#2 Le 11/11/2008, à 12:00

tiky

Re : [bash] Dernier champs du chemin d'un dossier

pwd | egrep -o '[^/]+$'
pwd | awk -F/ '{print $NF}'

Dernière modification par tiky (Le 11/11/2008, à 12:07)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#3 Le 11/11/2008, à 12:18

clem-vangelis

Re : [bash] Dernier champs du chemin d'un dossier

pourquoi faire compliqué quand on peux faire simple big_smile :

basename `pwd`

Hors ligne

#4 Le 11/11/2008, à 12:29

®om

Re : [bash] Dernier champs du chemin d'un dossier

clem-vangelis a écrit :

pourquoi faire compliqué quand on peux faire simple big_smile :

basename `pwd`

Ah sympa smile
Moi je faisais :

# Returns the canonical name of the file, from its (full) path.
#
# $1: (full) path of the file
# return: canonical name of the file
#
# example: get_filename 'a/b.c/d.e.f.jpg' returns 'd.e.f.jpg'
get_filename() {
    local path="$1"
    printf %s "$path" | grep -o '[^\/]\+$'
}

basename c'est dispo partout par défaut?

Et pour avoir le répertoire (dans /a/b/c, pour que ça retourne /a/b)?
Y'a une commande aussi simple?

Hors ligne

#5 Le 11/11/2008, à 12:39

claudius01

Re : [bash] Dernier champs du chemin d'un dossier

Bonjour,

Et bien, cela doit être ...

dirname /a/b/c

Cordialement, A+
--
Claudius

Hors ligne

#6 Le 11/11/2008, à 12:40

clem-vangelis

Re : [bash] Dernier champs du chemin d'un dossier

dirname `pwd` big_smile

ces commandes doivent faire partie des commandes de base installées sur pratiquement toutes les distribs linux je pense

Dernière modification par clem-vangelis (Le 11/11/2008, à 12:41)

Hors ligne

#7 Le 11/11/2008, à 12:43

®om

Re : [bash] Dernier champs du chemin d'un dossier

Et pour avoir l'extension / le nom sans l'extension ?
Pour l'instant :

# Returns the canonical name of the file, from its (full) path.
#
# $1: (full) path of the file
# return: canonical name of the file
#
# example: get_filename 'a/b.c/d.e.f.jpg' returns 'd.e.f.jpg'
get_filename() {
    local path="$1"
    printf %s "$path" | grep -o '[^\/]\+$'
}

# Returns the radical of a filename (its name without the extension), from its
# (full) path.
#
# $1: (full) path of the file
# return: radical of the file
#
# exemple: get_radical 'a/b.c/d.e.f.jpg' returns 'd.e.f'
get_radical() {
    local path="$1"
    local filename="$(get_filename "$path")"
    printf %s "$filename" | sed 's/\.[^\.]*$//'
}

# Returns the extension of a file, from its (full) path.
#
# $1: (full) path of the file
# return: extension of the file
#
# exemple: get_extension 'a/b.c/d.e.f.jpg' returns 'jpg'
get_extension() {
    local path="$1"
    local filename="$(get_filename "$path")"
    printf %s "$filename" | grep -o '[^\.]\+$'
}

Si y'a plus simple, je suis preneur.

Hors ligne

#8 Le 11/11/2008, à 13:08

tiky

Re : [bash] Dernier champs du chemin d'un dossier

Basename est beaucoup moins portable que mes solutions avec awk ou grep.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#9 Le 11/11/2008, à 13:15

claudius01

Re : [bash] Dernier champs du chemin d'un dossier

Re,

S'agissant de " get_filename 'a/b.c/d.e.f.jpg' returns 'd.e.f.jpg' "

basename a/b.c/d.e.f.jpg

S'agissant de " get_radical 'a/b.c/d.e.f.jpg' returns 'd.e.f' " :

dirname `basename a/b.c/d.e.f.jpg | sed 's/\./\//g'` | cut -d'/' -f-

S'agissant de " get_extension 'a/b.c/d.e.f.jpg' returns 'jpg' " :

 basename `basename a/b.c/d.e.f.jpg | sed 's/\./\//g'`

Cordialement, A+
--
Claudius

Hors ligne

#10 Le 11/11/2008, à 13:19

claudius01

Re : [bash] Dernier champs du chemin d'un dossier

Re,

Petite erreur :

S'agissant de " get_radical 'a/b.c/d.e.f.jpg' returns 'd.e.f' " :

dirname `basename a/b.c/d.e.f.jpg | sed 's/\./\//g'` | cut -d'/' -f- | sed 's/\//./g'

Désolé, A+

Hors ligne

#11 Le 11/11/2008, à 13:28

Totor

Re : [bash] Dernier champs du chemin d'un dossier

Oui, il y a plus simple pour le "radical" :

#!/bin/bash
get_radical() {
    local path="$1"
    local filename="$(basename "$path")"
    echo ${filename%.*}
}

on pourrait faire la même chose avec l'extention :

#!/bin/bash
get_extension() {
    local path="$1"
    local filename="$(basename "$path")"
    echo ${filename##*.}
}

mais cela ne fonctionne pas si il n'y a pas d'extention !

donc, il faudrait passer par une étape supplémentaire :

#!/bin/bash
get_extension() {
    local path="$1"
    local filename="$(basename "${path}")"
    radical=${filename%.*} # on récupère le nom du fichier
    extention=${filename/${radical}/} # on remplace le radical par vide dans le nom
    # s'il y a une extention, alors il y a un point en début de la variable, on l'affiche donc à partir du 2nd caractère
    echo ${extention:1}
}

Dernière modification par Totor (Le 11/11/2008, à 14:18)


-- Lucid Lynx --

Hors ligne

#12 Le 11/11/2008, à 14:03

®om

Re : [bash] Dernier champs du chemin d'un dossier

Mais c'est bash-only cette solution (c'est pour ça que je ne l'utilise pas).

Totor a écrit :

mais cela ne fonctionne pas si il n'y a pas d'extention !

embêtant smile

Totor a écrit :

donc, il faudrait passer par une étape supplémentaire :

Au final c'est pas plus simple, si?

Hors ligne

#13 Le 11/11/2008, à 14:30

Totor

Re : [bash] Dernier champs du chemin d'un dossier

®om a écrit :

Mais c'est bash-only cette solution (c'est pour ça que je ne l'utilise pas).

ben 'faut savoir... si faut pas que ce soit bash-only, 'faut pas mettre bash dans le titre du post hmm

®om a écrit :

Au final c'est pas plus simple, si?

Qd à savoir si c'est plus simple...tout est une question de "goût/préférence/compréhension"... après, j'ai toujours entendu dire que c'était plus performant d'utiliser les instructions qui sont propres au shell employé. Après, pour "si peu", je ne pense pas que cela change grand chose.
D'ailleurs, plutôt que d'utiliser la commande basename, il est possible d'utiliser une instruction bash. Le tout devenant :

#!/bin/bash
get_radical() {
    filename=${1##*/}
    echo ${filename%.*}
}

get_extension() {
    filename=${1##*/}
    # on récupère le nom du fichier
    radical=${filename%.*} 
    # on remplace le radical par vide dans le nom
    extention=${filename/${radical}/}
    # s'il y a une extention, alors il y a un point en début de la variable, on l'affiche donc à partir du 2nd caractère
    echo ${extention:1}
}

EDIT : désolé @om pour la remarque sur le "bash-only", je n'avais pas vu que ce n'était pas toi l'auteur du post big_smile

Dernière modification par Totor (Le 11/11/2008, à 14:40)


-- Lucid Lynx --

Hors ligne

#14 Le 11/11/2008, à 15:28

congelli501

Re : [bash] Dernier champs du chemin d'un dossier

Mon but était de décomposer le nom d'un paquet sous MSYS.
Le commande "basename" existe avec MSYS, donc je vais utiliser cette commande (mieux vaut ne pas réinventer la roue !).

Voici mon script :

#! /bin/sh

progName=$(basename `pwd` | cut -d '-' -f 1)
progVersion=$(basename `pwd` | cut -d '-' -f 2)

pwd
echo $progName
echo $progVersion

Et le résultat :

console a écrit :

/media/p/devismaker/devismaker-1.0.0
devismaker
1.0.0

Merci à tous !

Dernière modification par congelli501 (Le 11/11/2008, à 15:36)

Hors ligne