Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

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.

#26 Le 07/12/2017, à 21:44

AGP-Architecture

Re : erreur avec sed dans un script

@Watael

En fait je ne vois pas comment faire une boucle avec ton morceau de code. En plus je n'arrive pas à le "lire" et le comprendre surtout qu'il est sur plusieurs lignes

voici celui que j'utilise actuellement avec un ls

while read FICHIER
do
     	if [ -f "$FICHIER" ]; then
		
		EXT=${FICHIER##*.};
		EXT=${EXT,,}
		echo -e "\t$FICHIER  -->>  $EXT"
		
		NUMERO=$(printf "%03d" $I)
		
		mv "$FICHIER" "$DOSSIERATRAITER$NOMDOSSIER$SEPARATEUR$NUMERO.$EXT"
			
                echo -e "\tfichier : $FICHIER  -- >>  $DOSSIERATRAITER$NOMDOSSIER$SEPARATEUR$NUMERO.$EXT\n"
        
        ((I++))
    
	fi
done < <(ls "$DOSSIERATRAITER"* | sort -V)

comment je peux transformer ça avec ton code? Voir me donner des explications sur ce que signifie
... -printf '%fµ%h\0' \ du find
\ à chaque fin de ligne
IFS='µ' read -d '' -r fileName dirName; dans le while

En gros pourrais-tu me "traduire en français" ton code pour pouvoir comprendre comment il travail.

Merci beaucoup

Hors ligne

#27 Le 07/12/2017, à 22:21

Watael

Re : erreur avec sed dans un script

plus je lis ton script, plus je ne trouve pas de raison de faire un tri : les fichiers sont déplacés/renommés dans le même répertoire.
ça pourrait avoir une utilité si ils devaient figurer en ordre numérique (dé)croissant dans un fichier, mais ce n'est pas le cas ici.

je suis à peu près certain qu'il n'y a pas d'ordre dans un système de fichiers (ext{1..4}). il n'y a qu'à regarder les différentes manières qu'ont bash, ls, find d'afficher les fichiers.
c'est le logiciel de lecture qui les mettra dans l'ordre qui lui semble le plus pertinent.

donc, qu'importe l'ordre dans lequel tu traites tes fichiers, pour le système de fichiers, ça n'a pas d'importance, et les logiciels rétabliront l'ordre dont ils ont besoin.


eval, c'est mal.

Hors ligne

#28 Le 07/12/2017, à 22:57

AGP-Architecture

Re : erreur avec sed dans un script

merci Watael pour l'aide déjà apportée mais je crois qu'on ne c'est pas compris sur un point. Un fichier ebook courant est le format cbz. Celui-ci est simple fichier zip reprenant les pages de l'ebook. Le programme tri effectivement les fichier dans l'ordre qu'il souhaite. c'est à dire dans l'ordre des nom de page. Donc si je renomme les fichiers avant de les zipper il faut absolument que je garde l'ordre des "pages" après renommage.

donc le dossier avant d'être zipper est présenté d'une des façons suivantes (ordre sur le nom)

DossierBd                                                         DossierBD2
   1.jpg                                                                   Page_1.jpg
   2.jpg                                                                   Page_2.jpg
   3.jpg                                                                   Page_3.jpg
   4.jpg                                                                   Page_4.jpg
   5.jpg                                                                   Page_5.jpg
   6.jpg                                                                   Page_6.jpg
   7.jpg                                                                   Page_7.jpg
   8.jpg                                                                   Page_8.jpg
   9.jpg                                                                   Page_9.jpg
   10.jpg                                                                 Page_10.jpg
   11.jpg                                                                 Page_11.jpg
   12.jpg                                                                 Page_12.jpg
   13.jpg                                                                 Page_13.jpg

donc si je renomme les fichiers pour avoir une structure de nommage identique entre les BD if faut que je garde cet ordre afin que mon logiciel de lecture connaisse l'ordre des pages (basé sur la numérotation). Donc quand je fais un ls qui me sort l'ordre 10.jpg 11.jpg ...15.jpg 1.jpg 2.jpg (non respect de l'ordre numérique) je ne peux pas les renommer sans les trier avant sinon le logiciel ne saura pas classer les fichier par ordre croissant des pages. J'espère que ca éclaire sur la raison de l'ordre à respecter.

Pourrais-tu quand même m'expliquer ton code pour mon apprentissage et si tu as une autre solution pour renommer  sans trier avant je suis preneur

Hors ligne

#29 Le 07/12/2017, à 23:36

Watael

Re : erreur avec sed dans un script

les répertoires ne conservent pas les fichiers dans l'ordre, quelque soit l'ordre dans lequel tu les fais s'afficher : le système de fichiers a son "ordre" personnel.
pas analogie, une base de données n'est jamais "dans l'ordre". hmm
elle est dans l'ordre des enregistrements.
l'affichage est distinct du stockage.

si le logiciel réalise une compression en ordonnant numériquement les fichiers, si tu en changes le nom, en y ajoutant des caractères alphabétiques, comment va-t-il faire ?

renommer sans trier, comme tu le fais déjà :

shopt -s nullglob
liste=( $repertoire/*/ )
((${#liste[*]})) && { echo "pas au dernier niveau"; exit 1;}
# si on connaît l'extension des fichiers cherchés, on peut l'ajouter au chemin
for f in $repertoire/* # $repertoire/*.jpg # par exemple
do
   # pas besoin de tester si le fichier est un fichier, puisqu'il n'y a pas de sous-répertoire
   ext=${ext##*.}
   ext=${ext,,}
   printf '\t%s%s'"$sep"'%03d.%s\n' "$repertoire" "$nomOriginal" $((numero++)) "$ext"
done

edit=on
ah, j'ai compris !
tes fichiers se composent d'un nombre et d'une extension, donc, forcément, puisqu'on refait la numérotation, il faut les itérer dans l'ordre numérique croissant !
mais alors, pourquoi ne pas simplement (KISS principle) reprendre le nom des fichiers sans extensions (récupérer les nombres) ?

par exemple :

$ mkdir testDir
$ touch testDir/{1..12}.jpg
$ for f in testDir/*.jpg; do dn=${f%/*}; fn="${f%.*}"; ext="${f##*.}"; fn="${fn##*/}"; echo "mv [$f] -> [ailleurs - $dn - $fn - ${ext,,}]"; done
mv [testDir/10.jpg] -> [ailleurs / testDir - 10 - jpg]
mv [testDir/11.jpg] -> [ailleurs / testDir - 11 - jpg]
mv [testDir/12.jpg] -> [ailleurs / testDir - 12 - jpg]
mv [testDir/1.jpg] -> [ailleurs / testDir - 1 - jpg]
mv [testDir/2.jpg] -> [ailleurs / testDir - 2 - jpg]
mv [testDir/3.jpg] -> [ailleurs / testDir - 3 - jpg]
mv [testDir/4.jpg] -> [ailleurs / testDir - 4 - jpg]
mv [testDir/5.jpg] -> [ailleurs / testDir - 5 - jpg]
mv [testDir/6.jpg] -> [ailleurs / testDir - 6 - jpg]
mv [testDir/7.jpg] -> [ailleurs / testDir - 7 - jpg]
mv [testDir/8.jpg] -> [ailleurs / testDir - 8 - jpg]
mv [testDir/9.jpg] -> [ailleurs / testDir - 9 - jpg]
$

edit=off

il serait utile que tu nous donnes un tree du répertoire_à_traiter,
même fictif, si tu préfères, mais aussi fidèle à la réalité que possible, qu'on puisse le reproduire,
ainsi que le retour de ce que font nos scripts, et le résultat attendu correspondant à la sortie de tree montrée.

Dernière modification par Watael (Le 08/12/2017, à 02:36)


eval, c'est mal.

Hors ligne

#30 Le 08/12/2017, à 12:00

AGP-Architecture

Re : erreur avec sed dans un script

C'est ça tu as bien compris la raison du classement avant de renommer.

+1 pour la vérification que c'est bien un fichier inutile

Par contre je ne peux pas garder les numéros des fichier d'origine parce :
1. Parfois les numéro sont remplacé par des lettre (exemple BdPageA.jpg, BdPageB.jpg BdPageB2.jpg BdPageC ...)
2. Il parfois des "trous" dans la numérotation suite à la suppression de pages en double par exemple (page1.jpg, page2.jpg, Page4.jpg, ...)

Donc je ne peux pas trop ma fier à la numérotation exacte des fichiers d'origines. Cependant je veux pouvoir avoir c'est un structure pour les nouveaux fichier de type :

Nom du dossier avec majuscule sur chaque mot sans espace ni caractère spéciaux suppression des éléments entre () {} [] un tiret puisq une numérotation algébrique sur 3 chiffres  et l'extension du fichier

Voici mon script qui fait parfaitement ce que je souhaite et il me semblais KISS principe

#!/bin/bash

NOMDOSSIER=""
I=1
SEPARATEUR="-"
DOSSIERATRAITER="$1"

if [ $(find "$DOSSIERATRAITER" -maxdepth 1 -type d | wc -l) -ne 1 ]; then # si contient un dossier ne pas traiter -ne 1 car dossier compté
    echo "contient un dossier, ne peut être traité"
    exit 2
fi

DOSSIERPARENT="$DOSSIERATRAITER/.."

if [ ! -d "$DOSSIERPARENT/00-Backup" ]; then #création d'un dossier pour les backup avant traitement
	mkdir "$DOSSIERPARENT/00-Backup"
fi

NOMDOSSIER=$(basename "$DOSSIERATRAITER")
NOMDOSSIER=$(sed 's#.*/##;s#([^)]*)##g;s#\[[^]]*\]##g;s#{[^}]*}##g;s#[ +=*?-]##g;s#[àâ]#a#g;s#[éèê]#e#g' <<<"$NOMDOSSIER") 

cp -a "$DOSSIERATRAITER" "$DOSSIERPARENT/00-Backup" # TODO : Quid si dossier existe déjà

while read FICHIER; do

     	if [ -f "$FICHIER" ]; then
		
            EXT=${FICHIER##*.};
            EXT=${EXT,,}
	
            NUMERO=$(printf "%03d" $I)
		
            mv "$FICHIER" "$DOSSIERATRAITER$NOMDOSSIER$SEPARATEUR$NUMERO.$EXT"
            echo -e "\tfichier : $(basename "$FICHIER")  -- >>  $NOMDOSSIER$SEPARATEUR$NUMERO.$EXT" # pour voir ce qu'il fait au fur et à mesure
        
            ((I++))
    
	fi
done < <(ls "$DOSSIERATRAITER"* | sort -V)

#on zip le dossier avec la bonne extension
TEMP="$(basename "$DOSSIERATRAITER")"
zip -r "$TEMP.cbz" "$(basename "$DOSSIERATRAITER")" # TODO: check si cbz existe dejà

exit 0

en fait comme je débute en bash (provenant de C# et php) j'ai du mal avec la syntaxe de bash du coup quand je vois quelque chose comme ça

Watael a écrit :

find ... -printf '%fµ%h\0' \
   | sort -Vz \
   | while IFS='µ' read -d '' -r fileName dirName; do
      : whatever with "$dirName" & "$fileName"
     done

je traduits

Trouve ... (pourquoi  3 points ??? ) avec écrit des caractère bizarre (ca représente quoi???) pourquoi un antislash (et ca sert à quoi puisque c'est pas un pype ???)
ok sort jai compris que ca ordonne le résultat big_smile (faut bien comprendre quelque chose)
Lit le résultat tant que possible avec le caractère µ comme séparateur d'élement et fait quelque chose avec le nom du dossier et le fichier

Hors ligne

#31 Le 08/12/2017, à 13:02

Watael

Re : erreur avec sed dans un script

les trois points. c'est parce que je ne connais pas exactement les critères de recherche.
on peut spécifier beaucoup de choses :
que les fichiers
que les noms ayant un motif
que les noms correspondant à une regex
que ... wink

l'anti-slash permet de continuer la commande sur une nouvelle ligne.

je voudrais un tree de ton répertoire
et le résultat attendu correspondant.

Dernière modification par Watael (Le 08/12/2017, à 13:21)


eval, c'est mal.

Hors ligne