#1 Le 10/10/2010, à 12:29
- boutor
[résolu] [BASH] mkdir -p pour les fichiers
Bonjour à tous,
D'habitude pour créer un fichier vide, je fais touch my_file
Hors dans le cas présent, je dois créer des fichiers avec une arborescence :
/opt/my/dir/my_file
J'ai des listes importantes de fichiers à créer.
Et le répertoire /my/dir n'existe pas.
Du coup touch /opt/my/dir/my_file, ne fonctionne pas.
Suis-je obligé de couper en deux?
mkdir -p /opt/my/dir
touch /opt/my/dir/my_file
Comment récupérer /opt/my/dir du coup? Avec cut ou sed, je merdoie...
Et je ne suis pas contre awk.
Merci pour toute aide
Dernière modification par boutor (Le 10/10/2010, à 13:21)
Hors ligne
#2 Le 10/10/2010, à 12:39
- Vysserk3
Re : [résolu] [BASH] mkdir -p pour les fichiers
Je ne suis pas bien sûr d'avoir tout compris, mais tu peux faire une variable qui contiendra le nom du dossier et que tu pourras récupérer partout
dir="/opt/my/dir"
mkdir -p $dir
touch $dir/my_file
Hors ligne
#3 Le 10/10/2010, à 12:47
- ®om
Re : [résolu] [BASH] mkdir -p pour les fichiers
path="aaa/bbb/ccc.ddd"
dir="${path%/*}"
file="${path##*/}"
mkdir -p "$dir"
touch "$dir/$file"
Hors ligne
#4 Le 10/10/2010, à 12:49
- kyncani
Re : [résolu] [BASH] mkdir -p pour les fichiers
Tu peux récupérer le nom du répertoire parent avec dirname. Deux outils utiles : basename et dirname pour récupérer respectivement le répertoire parent et le nom du fichier sans le nom du répertoire.
Hors ligne
#5 Le 10/10/2010, à 13:21
- boutor
Re : [résolu] [BASH] mkdir -p pour les fichiers
basename et dirname fonctionnent parfaitement. Une solution simple à retenir.
Effectivement, je ne devais pas être clair. J'ai des fichiers textes contenant des listes de fichiers à créer. Je ne peux pas taper dir= pour chacun (humainement parlant ).
@Rom: je garde ta solution, mais pour d'autres contextes.
Merci à vous.
Hors ligne
#6 Le 10/10/2010, à 19:36
- Totor
Re : [résolu] [BASH] mkdir -p pour les fichiers
Voilà qui redéfinit touch dans sa plus simple utilisation (donc sans les arguments) :
( à mettre dans son ~/.bashrc )
function touch
{
(( $# > 0 )) && {
for arg
do
[[ "${arg}" = */* ]] && mkdir -p ${arg%/*}
done
}
command touch "$@"
}
export -f touch
si tu souhaites pouvoir utiliser la version initiale de touch, il te faut :
- soit préciser le chemin complet
- soit définir un alias de la version initale
- soit modifier le nom de la fonction ci-dessus
-- Lucid Lynx --
Hors ligne