bah, ouais, si tu essayes d'exécuter un script bash avec sh, ça va pas fonctionner !
ajoute un shebang (#!/bin/bash) au début du script.
rends-le exécutable (chmod u+x tonScript)
et exécute-le là où il est (./tonScript).
bah, ouais, si tu essayes d'exécuter un script bash avec sh, ça va pas fonctionner !
ajoute un shebang (#!/bin/bash) au début du script.
rends-le exécutable (chmod u+x tonScript)
et exécute-le là où il est (./tonScript).
Bien disons que il n'y a que comme ca qu'il se lançait sur le media externe, ducoup j'ai tellement était vite a le tester que j'ai zap les bases....
Merci je reteste au plus vite
bon après test perso sur le DD externe directement ca ne fonctionne pas de permission accordée.
En local avec un dossier contenant répertoires et fichiers, le soucis il me copie juste le contenu identique dans un nouveau dossier "trier" voilà le code tester en local.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #!/bin/bash shopt -s extglob src="/home/aerane/Test" find "$src" -type f -printf '%h|%f\n' | while IFS='|' read d f do dest="/home/aerane/Test/trier/${d/$src\/}" test -d "$dest" || mkdir -p "$dest" cp "$d/$f" "/$dest/${f//+([[:punct:]]|[0-9])/ }" done
ça semble fonctionner pour moi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $ ls -R monDir/ monDir/: monSousDir1 monSousDir2 monSousDir3 monSousDir4 monDir/monSousDir1: fi-c_h%ier123 monDir/monSousDir2: fi-c_h%ier123 monDir/monSousDir3: fi-c_h%ier123 monDir/monSousDir4: fi-c_h%ier123
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 $ cat monScript #!/bin/bash shopt -s extglob src="./monDir" find "$src" -type f -printf '%h|%f\n' | while IFS='|' read d f do dest="./monDir/trier/${d/$src\/}" test -d "$dest" || echo mkdir -p "$dest" echo cp "$d/$f" "$dest/${f//+([[:punct:]]|[0-9])/ }" donequand j'enlève les echo, et après exécution du script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 $ ./monScript mkdir -p ./monDir/trier/monSousDir1 cp ./monDir/monSousDir1/fi-c_h%ier123 ./monDir/trier/monSousDir1/fi c h ier mkdir -p ./monDir/trier/monSousDir4 cp ./monDir/monSousDir4/fi-c_h%ier123 ./monDir/trier/monSousDir4/fi c h ier mkdir -p ./monDir/trier/monSousDir2 cp ./monDir/monSousDir2/fi-c_h%ier123 ./monDir/trier/monSousDir2/fi c h ier mkdir -p ./monDir/trier/monSousDir3 cp ./monDir/monSousDir3/fi-c_h%ier123 ./monDir/trier/monSousDir3/fi c h ierpar contre, le fait que trier soit sous Test peut poser un problème, car les fichiers sous trier seront aussi pris en compte...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 ls -R ./monDir monDir/: monSousDir1 monSousDir2 monSousDir3 monSousDir4 trier monDir/monSousDir1: fi-c_h%ier123 monDir/monSousDir2: fi-c_h%ier123 monDir/monSousDir3: fi-c_h%ier123 monDir/monSousDir4: fi-c_h%ier123 monDir/trier: monSousDir1 monSousDir2 monSousDir3 monSousDir4 monDir/trier/monSousDir1: fi c h ier monDir/trier/monSousDir2: fi c h ier monDir/trier/monSousDir3: fi c h ier monDir/trier/monSousDir4: fi c h ier
il faut adapter le script et le find :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #!/bin/bash shopt -s extglob src="/sda1/CFT" #à mettre à ta sauce dest="/sda6/MFT" #idem find "$src" -path "$dest" -prune -o -type f -printf '%h|%f' | while IFS='|' read d f do dest="$dest/${d/$src\/}" ... done
bon une fois le probleme du DD externe réglé j'ai tenté un premier avec echo qui n'a pas de message d'erreur, le hic il ne me crée pas le dossier au nom du fichier mais ça crée un dossier /media/sdb5/a_trier dans le dossier trier.
résultat avec le script donner par N_BaH
Il me déplace tout le contenu de "a_trier" dans un dossier "trier" qu'il crée mais le souci que j'ai j'aurai besoin que le nom du dossier soit celui du fichier, et que si il existe il le copie juste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 cp /media/sdb5/a_trier/_YunF__ZF__Kyouka2_10_.mp4 /media/sdb5/trier//media/sdb5/a_trier/ YunF ZF Kyoukai mp mkdir -p /media/sdb5/trier//media/sdb5/a_trier cp /media/sdb5/a_trier/_YunF__ZF__Kyoukai_2_12_.mp4 /media/sdb5/trier//media/sdb5/a_trier/ YunF ZF Kyoukai mp mkdir -p /media/sdb5/trier//media/sdb5/a_trier cp /media/sdb5/a_trier/_YunF__ZF__Kyoukai2_13_.mp4 /media/sdb5/trier//media/sdb5/a_trier/ YunF ZF Kyoukai mp
récapitulatif du code actuel:
le :punct: supprimait le point de l’extension, du coup j'ai testé en détaillant les caractères que j'ai sur mes fichiers tests à supprimer et ça fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #!/bin/bash shopt -s extglob src="/media/sdb5/a_trier" find "$src" -type f -printf '%h|%f\n' | while IFS='|' read d f do dest="/media/sdb5/trier/${d/$src\/}" test -d "$dest" || mkdir -p "$dest" cp "$d/$f" "$dest/${f//+([_]|[0-9]|[-])/ }" done
Après ce n'est pas fini, car je dois ignoré les chiffres pour la recherche sans ignoré le fichier lui même...tout en les conservant dans le nom de fichier et non du dossier (casse tête je sais)
Sur le plan actuel le script me les supprimes, sauf que je dois les garder dans le nom copié.
Ce que je n'arrive pas à faire est d'ignorer le chiffre pour find. Et de le garder dans le nom de la copie, je n'ai qu'a retirer l'exception du cp.
Donc je suis reparti sur une base tel quel:
ce qui me donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #!/bin/bash shopt -s extglob src="/media/sdb5/a_trier" dest="/media/sdb5/trier" find "$src" -type f -printf '%h|%f\n' | while IFS='|' read d f do test -d "$dest" || echo mkdir -p "$dest" echo cp "$d/$f" "$dest/${f//+([_]|[%]|[-])/ }" done
Il faut enfaite que j'arrive à travailler sur le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 cp /media/sdb5/a_trier/_YunF__ZF__Kyouka2_10_.mp4 /media/sdb5/trier/ YunF ZF Kyoukai2 10 mp4 mkdir -p /media/sdb5/trier//media/sdb5/a_trier cp /media/sdb5/a_trier/_YunF__ZF__Kyoukai_2_12_.mp4 /media/sdb5/trier/ YunF ZF Kyoukai2 12 mp4 mkdir -p /media/sdb5/trier//media/sdb5/a_trier cp /media/sdb5/a_trier/_YunF__ZF__Kyoukai2_13_.mp4 /media/sdb5/trier/ YunF ZF Kyoukai2 13 mp4
Code : Sélectionner tout - Visualiser dans une fenêtre à part test -d "$dest" || echo mkdir -p "$dest"
Pour retravailler le mkdir du dossier je suis tombé là-dessus :
Le souci est que cela ne fonctionne que si le fichier est seul dans son répertoire ce qui n'est pas mon cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 variable1=$(ls repertoire) variable2=$(echo $varaible1 | cut -d"." -f1) mkdir $variable2 mv $variable1 $variable2
Donc l'idée est de passer le nom du fichier en variable pour créer le dossier (toujours en excluant les chiffres) et c'est là que je bloque à nouveau.
il est préférable de conserver lspour un usage interactif de la console.
autant dire : ON N'UTILISE PAS ls DANS LES SCRIPTS !!!
(je crie un petit peu parce que j'ai l'impression de le dire au moins une fois par semaine , mais tu n'étais pas là)
find ne s'occupe pas du format des noms des fichiers, il sort la liste de tous les fichiers.
si tu veux que la copie/renommage laisse les chiffres, et n'enlève que - et _ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part cp "$d/$f" "$dest/${f//+([_-])/ }"
des espaces au début d'un nom de fichiers... je crois rêver... non, c'est un cauchemar !
après je ne sais pas. la substitution fonctionne bien pour moi : "$d" n'est pas repris dans "$dest"...
?
Ça je l'ai assez lu dans les postes et c’était même une de mes premières erreurs sur mes premiers scripts...
et bien les espaces sont la car en début de certains fichier j'ai des [] contenant des - ou _ donc normal que cela finisse en espace.
Pour la substitution je ne saurai trop dire je poste mes résultats car je ne déchiffre pas tout, mes lacunes en shell sont encore bien grandes.
Après le problème majeur restant est la récupération du nom de fichier pour en faire un dossier.
Quand je reprends un des scripts donnés plus haut je voie dest="./monDir... utilise tu un script secondaire ? Je n'ai pas bien saisie cette étape, mon problème viendrait peut être que je l'ai remplacer directement par les chemins où aller.
J'ai testé un truc un peu cochon test -d "$dest" | xargs -d 'n' mkdir < liste via une liste de fichier tiré avec un ls -a hors script.
Le résultat est pas très beau mais ça mène vers une piste, j'ai la créations de dossier construit avec des morceaux du noms original...Ça ressemble a rien en résultat du genre -__-02-__- mais ça puise les caractères dans le nom d'origine.
j'avais bien compris; ça n'en est pas moins horrible.les espaces sont la car en début de certains fichier j'ai des [] contenant des - ou _ donc normal que cela finisse en espace.
non.Quand je reprends un des scripts donnés plus haut je voie dest="./monDir... utilise tu un script secondaire ?
c'est bien ce qu'il faut faire : adapter à ta configuration.Je n'ai pas bien saisie cette étape, mon problème viendrait peut être que je l'ai remplacer directement par les chemins où aller.
je confirme : je n'avais pas entendu ça.Après le problème majeur restant est la récupération du nom de fichier pour en faire un dossier.
tu veux bien détailler (avec des exemples, s'il te plaît.).
mais, il faut vraiment que tu ouvres le man bash, pour y lire les paragraphes à propos du Développement des chemins et des Motifs génériques.
Je pense être sur la bonne voie après mon gros crachat à partir de la liste, en parlant de la substitution j'ai eu en idée de la mettre avant le "$dest" dans le xargsnouveau code:
Résultat ci dessous:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #!/bin/bash -x shopt -s extglob src="/mnt/a_trier" dest="/mnt/trier" find "$src" -type f -printf '%h|%f\n' | while IFS='|' read d f #<list.txt do test -d "$dest" | xargs -d 'n' mkdir -p "$d/$f" "$dest" echo cp "$d/$f" "$dest/${f//+([_]|[%]|[-])/ }" done
Il faudrait donc exclure les extensions de fichiers si j'utilise en test sur le premier dossier où j'avais encore quelques séries.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 aerane@aerane-GX723:/mnt$ ./tri_test_v02.sh + shopt -s extglob + src=/mnt/a_trier + dest=/mnt/trier + find /mnt/a_trier -type f -printf '%h|%f\n' + IFS='|' + read d f + test -d /mnt/trier + xargs -d n mkdir -p /mnt/a_trier/_Meda__Koi_to_Senkyo_to_Chocolate_11_HD_Vostfr_-.mp4 /mnt/trier mkdir: impossible de créer le répertoire «/mnt/a_trier/_Meda__Koi_to_Senkyo_to_Chocolate_11_HD_Vostfr_-.mp4»: Le fichier existe + echo cp /mnt/a_trier/_Meda__Koi_to_Senkyo_to_Chocolate_11_HD_Vostfr_-.mp4 '/mnt/trier/ Meda Koi to Senkyo to Chocolate 11 HD Vostfr .mp4' cp /mnt/a_trier/_Meda__Koi_to_Senkyo_to_Chocolate_11_HD_Vostfr_-.mp4 /mnt/trier/ Meda Koi to Senkyo to Chocolate 11 HD Vostfr .mp4
Ensuite il cherche à créer le nom de dossier en y incluant en exemple ici le numéro de l’épisode (ayant aussi des numéros sur mes fichiers de traitements au travail le problème reste identique) hors je cherche à les exclure si possible.
J'ai besoin de passé le nom de fichier en variable pour en faire un nom de dossier mais en excluant les chiffres.
Cela pour avoir un dossier dans lequel, ensuite, tout les fichiers avec un nom identique (hors chiffres toujours) s'y copie. Mais tout en gardant les numéros dans le nom du fichier:
Exemple:
Fichier_beta%_123 => récupération du nom en variable pour en faire un dossier => fichier_beta
Dans fichier_beta => on copie tout les fichiers nommés=> fichier_beta%_123 fichier_beta%12254...
Sachant que mes noms de fichiers ne sont pas réellement fixe dans la syntaxe, donc je ne peux pas les inclure en variable manuellement.
Il faut voir ça comme une variable dynamique...
les test sur $d n'affiche aucune données le pipe ne sert à rien, et je me demande ce que traite (àmha inutile) xargs.
j'ai l'impression que les spécifications ont changé
...
?
est-ce qu'il faut tenir compte du répertoire sous lequel se trouve les fichiers, sous $src?
càd:find "$src" -type f va afficher
on remplace /mnt/sda1 par /mnt/sda6, et après ? que fait-on des répertoires "intermédiaires" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /mnt/sda1/repertoire/fichier_b_zar%123.ext /mnt/sda1/autre_repertoire/fichier_-_b_zar%123.ext
j'ai expliqué les spécificités de la chose sur la première page déjà ^^"
disons que je test un peu en tout sens pour voir le résultat.
Sachant que le script au final sera dans un dossier spécifique il serait plus convenable de tenir compte du répertoire où se trouveront les fichiers.
Mais c'est le contenu qui intéresse.
exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /mnt/sda1/repertoire/fichier_b_zar%123.ext #emplacement origine /mnt/sda1/autre_repertoire/fichier_-_b_zar%123.ext # autre_répertoire serait celui ayant le nom des fichiers qu'il contient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /mnt/sda1/repertoire/fichier_b_zar%123.ext /mnt/sda1/fichier_-_b_zar/fichier_-_b_zar%123.ext
donc, il faut ne pas tenir compte des répertoires intermédiaires:affiche
Code : Sélectionner tout - Visualiser dans une fenêtre à part find /mnt/sda1 -type fdoivent être copier vers :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /mnt/sda1/repertoire/fichier_b_zar%123.ext /mnt/sda1/autre_repertoire/fichier_-_b_zar%123.exton va y arriver.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /mnt/sda6/fichier_b_zar%/fichier b zar 123.ext /mnt/sda6/fichier_-_b_zar%/fichier b zar 123.ext
Voilà, ça se résume à ça ,en ignorant les numéros et extension pour le nom de dossier.
si on a les fichiers
le dossier ou ils seront copier doit prendre en nom
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 fichier_-_b_zar%123.ext fichier_-_b_zar%1234.ext fichier_-_b_zar%12345.ext
Code : Sélectionner tout - Visualiser dans une fenêtre à part /fichier_-_b_zar%dossier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Fichtemp_-_ko%_54.ext Fichtemp_-_ko%_545.extainsi de suite
Code : Sélectionner tout - Visualiser dans une fenêtre à part /Fichtemp_-_ko
pour le moments % ou - peuvent rester, je remplacerai tout au final par des underscore, plus beau pour les yeux et la lecture.
pas très cohérent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $ shopt -q extglob || shopt -s extglob $ echo "fichier_-_b_zar%123.ext fichier_-_b_zar%1234.ext fichier_-_b_zar%12345.ext Fichtemp_-_ko%_54.ext Fichtemp_-_ko%_545.ext" | while read f; do f="${f//?(_)+([0-9])}"; f="${f%.*}"; echo "$f"; done fichier_-_b_zar% fichier_-_b_zar% fichier_-_b_zar% Fichtemp_-_ko% Fichtemp_-_ko%
Je suis d'accord et c'est justement le soucis où m'a liste varie quotidiennement.
Je ne peux pas vraiment lister tout les fichiers que je dois traités dans un script sinon j'aurai pu le faire sans me prendre tant la tête.
C'est presque avoir un script dynamique au final car je ne peux pas me baser sur du fixe pour cette automatisation, si ce n'est 4 choses:
1_l'endroit où les fichiers arrivent
2_où ils sont copier
3_quelle forme doit avoir le nom de dossier (nom du fichier sans chiffre)
4_copier et garder le nom des fichiers identiques tout en corrigeant les symboles potentiellement genant(% -)
C'est un sacré cahier des charges
c'est sans doute pas aussi terrible que ça.
Heureusement, il y a le Développement des chemins et les Motifs génériques.
et si ça suffit pas (mais ça m'étonnerait), on trouvera bien une regex.
j'espère bien car ca m'apprendrai pas mal de choses supplémentaires sur le shell, et un script de se type pourra être une très bonne base pour des plus élaborés (que j'ai déjà +/- en tête) mais tout en gardant la fonction de base de celui ci.
Déjà réussir celui là sera d'une grande satisfaction pour moi.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager