BASH : Répertoire parent (afficher juste le nom)

Tout ce qui concerne la programmation.
Répondre
Avatar du membre
dezix
Membre
Membre
Messages : 465
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

13 oct. 2019, 13:26

Bonjour,

j'ai besoin d'un petit coup de pousse pour une commande dans un script.

Je décris d'abord le contexte :

dans une arborescence (zim) qui ressemble à :

Code : Tout sélectionner

.../parent/
          ├── page.txt
          └── page/
                   ├── pasted_image.png
                   ├── pasted_image001.png
                   ├── pasted_image002.png
                   ├── sous-page.txt
                   └── sous-page/
                                 ├── ...
                                 └── ...
qui correspond à :

un document "page" dont :
* page.txt contient le contenu principal textuel
* ./page répertoire contenant :
* les images incluses dans "page"
* des sous-pages de "page" et les éventuels répertoires qui leurs seraient associés


Ce système que je trouve très pratique pour créer de la documentation illustrée,
a un inconvénient auquel je veux palier :

Toutes les images collées de toutes les pages sont nommées "pasted_image..." comme le montre l'échantillon (au dessus)


Mon but est :

Code : Tout sélectionner

├── page.txt
└── page/
        ├── page000.png
        ├── page001.png
        ├── page002.png

Comme je dois en traiter un wagon,

Je me suis lancé dans l'écriture d'un script devant :


1. Se placer à la racine de l'export
2. Rechercher les fichiers : pasted_image.png les renommer pasted_image000.png
3. Renommer dans toute l'arborescence : .../page/pasted_imagexxx.png en .../page/pagexxx.png
4. Remplacer dans tous les fichiers .txt la chaîne "pasted_image.png" par "pasted_image000.png"
5. Remplacer dans tous les fichiers .txt la chaîne "pasted_imagexxx.png" par "pagexxx.png"


J'en suis au 3.
et je bute pour récupérer "page"
c'est à dire le NOM du répertoire parent des images PNG

Voici ce que j'ai obtenu :

Code : Tout sélectionner

$ find . -name "pasted_image[0-9]*.png" -print
./pasted_image000.png
./0-Accueil/aaaa/pasted_image001.png
./0-Accueil/aaaa/pasted_image000.png
./0-Accueil/aaaa/pasted_image002.png
./0-Accueil/bbbb/pasted_image001.png
./0-Accueil/bbbb/cccc/pasted_image001.png
./0-Accueil/bbbb/cccc/pasted_image000.png
./0-Accueil/bbbb/cccc/pasted_image003.png
./0-Accueil/bbbb/cccc/pasted_image002.png
./0-Accueil/bbbb/pasted_image000.png
./0-Accueil/bbbb/pasted_image002.png
./0-Accueil/pasted_image001.png
./0-Accueil/pasted_image000.png
./0-Accueil/pasted_image002.png

Code : Tout sélectionner

$ find . -name "pasted_image[0-9]*.png" -exec dirname '{}' \;
.
./0-Accueil/aaaa
./0-Accueil/aaaa
./0-Accueil/aaaa
./0-Accueil/bbbb
./0-Accueil/bbbb/cccc
./0-Accueil/bbbb/cccc
./0-Accueil/bbbb/cccc
./0-Accueil/bbbb/cccc
./0-Accueil/bbbb
./0-Accueil/bbbb
./0-Accueil
./0-Accueil
./0-Accueil
Mais,

Code : Tout sélectionner

$ find . -name "pasted_image[0-9]*.png" -exec basename $(dirname '{}') \;
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Comment obtenir :

Code : Tout sélectionner

.
aaaa
aaaa
aaaa
bbbb
cccc
cccc
cccc
cccc
bbbb
bbbb
0-Accueil
0-Accueil
0-Accueil
J'ai pensé à utiliser cut
mais il n'y a pas la possibilité de:
* sélectionner le dernier champ
* compter les champs pour indiquer le dernier

Peut-être y-a-t-il une commande pour connaître la "profondeur" d'un chemin ?


Merci pour vos suggestions
Debian testing/stable - XFCE
Avatar du membre
dezix
Membre
Membre
Messages : 465
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

13 oct. 2019, 19:54

je n'ai toujours pas la solution,
mais voici le type de commande que j'imaginais.

ça ne fonctionne pas comme je le souhaite,
je le mets pour info :wink:

Code : Tout sélectionner

find . -name "pasted_image[0-9]*.png" -ok rename  s/pasted_image/$(basename $(dirname '{}'))/ '{}' \;
< rename ... ./pasted_image000.png > ? y
rename(./pasted_image000.png, ./.000.png)
...
Comme on peut le constater la commande met un point où je voudrais le nom du répertoire parent.... :015:
Debian testing/stable - XFCE
Avatar du membre
dezix
Membre
Membre
Messages : 465
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

14 oct. 2019, 12:26

J'ai une solution (100% nouveau pour moi ... c'est pas difficile)

Voilà ce que ça donne sur la base de l'exemple précédent :

Code : Tout sélectionner

$ (shopt -s globstar; for d in **/; do e=${d%*/}; for f in $d*; do echo "$f is in directory $d with parent ${e##*/}"; done; done)
0-Accueil/aaaa is in directory 0-Accueil/ with parent 0-Accueil
0-Accueil/aaaa.txt is in directory 0-Accueil/ with parent 0-Accueil
0-Accueil/bbbb is in directory 0-Accueil/ with parent 0-Accueil
0-Accueil/bbbb.txt is in directory 0-Accueil/ with parent 0-Accueil
0-Accueil/pasted_image000.png is in directory 0-Accueil/ with parent 0-Accueil
0-Accueil/pasted_image001.png is in directory 0-Accueil/ with parent 0-Accueil
0-Accueil/pasted_image002.png is in directory 0-Accueil/ with parent 0-Accueil
0-Accueil/aaaa/pasted_image000.png is in directory 0-Accueil/aaaa/ with parent aaaa
0-Accueil/aaaa/pasted_image001.png is in directory 0-Accueil/aaaa/ with parent aaaa
0-Accueil/aaaa/pasted_image002.png is in directory 0-Accueil/aaaa/ with parent aaaa
0-Accueil/bbbb/cccc is in directory 0-Accueil/bbbb/ with parent bbbb
0-Accueil/bbbb/cccc.txt is in directory 0-Accueil/bbbb/ with parent bbbb
0-Accueil/bbbb/pasted_image000.png is in directory 0-Accueil/bbbb/ with parent bbbb
0-Accueil/bbbb/pasted_image001.png is in directory 0-Accueil/bbbb/ with parent bbbb
0-Accueil/bbbb/pasted_image002.png is in directory 0-Accueil/bbbb/ with parent bbbb
0-Accueil/bbbb/cccc/pasted_image000.png is in directory 0-Accueil/bbbb/cccc/ with parent cccc
0-Accueil/bbbb/cccc/pasted_image001.png is in directory 0-Accueil/bbbb/cccc/ with parent cccc
0-Accueil/bbbb/cccc/pasted_image002.png is in directory 0-Accueil/bbbb/cccc/ with parent cccc
0-Accueil/bbbb/cccc/pasted_image003.png is in directory 0-Accueil/bbbb/cccc/ with parent cccc
J'ai trouvé dans : info bash > Builtin commands > shopt
'globstar'
If set, the pattern '**' used in a filename expansion context
will match all files and zero or more directories and
subdirectories. If the pattern is followed by a '/', only
directories and subdirectories match.

Voilà qui, peut-être, sera utile pour certains.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pour mon script,
je crois ne pas avoir pris le problème par le bon bout en procédant par séries de fichiers avec find

Je vais revoir ma copie,
et attaquer un traitement global par chemins,
ce qui va me permettre d'utiliser simplement :

Code : Tout sélectionner

$ basename $(pwd)
ou
$ basename $PWD
Debian testing/stable - XFCE
Avatar du membre
dezix
Membre
Membre
Messages : 465
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

19 oct. 2019, 10:17

Voici une version courte de mon script qui renomme dans un bloc-note zim
toutes les captures collées directement du presse-papier (paste_imagexxx.png)
en "pagexxx.png"

Dans mon usage je renomme d'abord les "pasted_image.png" en "pasted_image000.png"

et ça donne :

Code : Tout sélectionner

#!/bin/bash
# 
# Script: zim_pict_rename_short.sh 
# Auteur: dezix 
# Date: 2019-10-18
# Version : 0.1-short
#
# Fonction: Zim => Renommer les images "pasted_image..." selon le nom de la page
#
################################################################################
#
# Fournir le chemin de la Racine de l'Arbo à traiter
# Message
echo -e "\n\nEntrer le chemin absolu de la racine : " ;
read racine_arbo ;
cd $racine_arbo ;
#
# Renommer les "pasted_image.png" en "pasted_image000.png"
find . -name "pasted_image.png" -exec rename -d s/pasted_image.png/pasted_image000.png/ '{}' \; ;
#
#	Liste des sous-répertoires <=> Page contenant des pièces attachées
#	NE RIEN AJOUTER au FICHIER -> /tmp/zim_remane_pict/page.list	(argument pour commandes suivantes)
mkdir /tmp/zim_remane_pict/
find . -type d -print > /tmp/zim_remane_pict/page.list ;
#
#
#	 Traitemenent par (sous-)réperoires
#
# Lecture liste des sous-répertoires => traitement individuel
#
while read activ_dir ;
do
	cd $activ_dir ;
	page_name=$(basename $(pwd))
	# Renommer les "pasted_imagexxx.png"  en  "pagexxx.png"
	rename s/pasted_image/$page_name/ *.png ;
	# Édition des fichiers "page.txt"
	cd ..
	sed -i s/pasted_image.png/pasted_image000.png/g $page_name.txt ;
	sed -i s/pasted_image/$page_name/g $page_name.txt ;
	# Retour à la racine pour suivant car chemins relatifs
	cd $racine_arbo ;
	
done < /tmp/zim_remane_pict/page.list ;		# Lire la liste des sous-répertpoires
#
# Message fin
echo -e "\nFIN du SCRIPT" ;
exit
Debian testing/stable - XFCE
Répondre