#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 :
basename `pwd`
Hors ligne
#4 Le 11/11/2008, à 12:29
- ®om
Re : [bash] Dernier champs du chemin d'un dossier
pourquoi faire compliqué quand on peux faire simple
:
basename `pwd`
Ah sympa
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`
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).
mais cela ne fonctionne pas si il n'y a pas d'extention !
embêtant
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
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
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
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 :
/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