Faire le ménage
Cherche commande pour déplacer en bloc les fichiers
Système et matériels / Administration système

mabthera Membre non connecté
-
- Voir le profil du membre mabthera
- Inscrit le : 10/06/2019
- Groupes :
Je ne sais pas vraiment où poster, j'essaie ici.
Voilà, je voudrais faire de la place sur mes disques, mais il y a trop de répertoires en double, triples, avec bien sûr des variantes disséminées un peu partout (selon la date de sauvegarde). Et le gestionnaire de fichiers ne m'aide pas beaucoup (trop de niveaux dans les sous répertoires).
J'aimerais avoir une commande qui balaie tous les fichiers de tous les sous répertoires d'un répertoire et les déplace à la racine. Mettons que la commande ne fasse rien pour les doublons, il suffit que je relance la commande après avoir déplacé l'ensemble des sous-répertoires dans un autre répertoire vide (rep1, rep2, autant de fois que nécessaire). Après cela, je pense que je pourrais plus facilement comparer les répertoires et faire le ménage avec dolphin ou autre.
Est-ce possible ?
Merci

nic80 Membre non connecté
-
- Voir le profil du membre nic80
- Inscrit le : 06/08/2018
- Groupes :
-
Modérateur
Je me demandes si fdupes (je n'ai jamais testé), pourrais être utile pour la recherche de doublons.

mabthera Membre non connecté
-
- Voir le profil du membre mabthera
- Inscrit le : 10/06/2019
- Groupes :
J'ai fait un test sur un répertoire de 569 fichiers, après avoir listé, on peut décider de ne garder qu'un occurrence et il supprime les autres. Cela marche bien, c'est rapide sur un petit répertoire et je vais y aller par tranches et en regroupant les répertoires, il va faire le ménage, mais cela devenir de plus en plus long.

magnux77 Membre non connecté
-
- Voir le profil du membre magnux77
- Inscrit le : 21/09/2009
- Groupes :
-
Membre d'Honneur
Code BASH :
find . -name "*" | while read F; do echo $(basename "$F") "-> $F"; done | sort
Pas besoin de déplacer les fichiers, il suffit de les lister. Cette commande recherche (find) tous les fichiers ("*") à partir du répertoire courant (.), passe la liste à une boucle de lecture qui affiche le "basename" du fichier, une flèche (->

La réponse peut être longue... Si tu veux voir les étapes intermédiaires, tu tronques la commande sur un pipe. Si tu veux le résultat dans un fichier tu ajoutes en fin de commande "> fichier.txt".
Tu peux t'aider en plus de "tree" pour voir clair dans l'arborescence et de baobab qui indique où l'espace disque est consommé.
Édité par magnux77 Le 05/04/2020 à 13h43
...depuis Mandrake 7
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]

Papoteur Membre non connecté
-
- Voir le profil du membre Papoteur
- Inscrit le : 03/10/2011
- Groupes :
-
Modérateur
-
Équipe Mageia
-
Administrateur
-
Forgeron
Idéalement, la commande n'affiche que les doublons.
C'est pour te pousser dans tes retranchements

Yves

mabthera Membre non connecté
-
- Voir le profil du membre mabthera
- Inscrit le : 10/06/2019
- Groupes :
magnux77 :
Pas besoin de déplacer les fichiers, il suffit de les lister.
Merci, cela marche, mais je ne pense pas y arriver comme cela avec des listings.
Je (re)précise le problème : sur un disque courant, j'ai un répertoire plus ou moins complet que je mets à jour continuellement (environ 200 éléments, 22 000 fichiers, 22.5 GO). Celui-là, je veux simplement le compléter avec ce qui traîne ailleurs sur 4 disques et des clés (répertoires plus anciens, vieilles sauvegardes sachant que j'ai fait plein de regroupements de fichiers et de répertoires et aussi, des renommages en pagaille).
Dans un premier temps, je pensais créer un répertoire unique (à partir de tout ce qui traîne) en ramenant tous les fichiers à la racine (plus besoin d’arborescence) et aller piocher dans ce répertoire unique en tant que de besoin pour compléter mon répertoire courant. Bien entendu, il y a des vrais doublons (fichiers identiques) et des faux doublons (homonymie, deux img1 pour désigner 2 choses différentes). Ce serait en quelques sorte une base de réserve et j'aurais fait ainsi en partie le ménage dans les copies (peut être 4 ou 5 fois le répertoire courant).
Dans un deuxième temps (plus tard), il faudrait confronter les 2 répertoires restants (le courant et l'unique) et vider l'unique de tout de qui existe dans le courant, puis jeter au fur et à mesure tout ce qui ne sert plus dans cet unique.
Je l'ai fait à la manu (avec digikam + fichiers + dolphin) pour les photos, avec des renommages en masse, j'ai passé des journées entières (sur plusieurs semaines), sachant que les mêmes photos pouvaient avoir des dates différentes (suivant les transferts, au fil des installations). Avec du tout venant (scans, bureautique, etc.), cela ne me paraît pas possible.

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Code BASH :
#!/bin/bash LIST_DOUBLON=$(mktemp) LIST_HASH_FILE=$(mktemp) LIST_HASH=$(mktemp) find . -name "*" | while read F; do md5sum $F ; done | sort >${LIST_HASH_FILE} cat ${LIST_HASH_FILE} | cut -d ' ' -f 1 | uniq >${LIST_HASH} for HASH in $(cat ${LIST_HASH}) ; do if [ 2 -lt $(grep "${HASH}" ${LIST_HASH_FILE} | wc -l) ] ; then grep "${HASH}" ${LIST_HASH_FILE} >${LIST_DOUBLON} fi done cat ${LIST_DOUBLON} rm -f ${LIST_DOUBLON} ${LIST_HASH_FILE} ${LIST_HASH}
Je ne garanti pas que ça marche, je ponds le code sur mon téléphone, je ne peux pas tester.
Ici, on ne prends même pas en compte le nom de fichier, mais sa somme et on compare les sommes.
Attention, ça sera long !
En gros, tu prends deux images, tu en copies une, tu leur donnes le même nom à toutes les trois, ou tu donne trois noms différents, comme tu veux, en les mettant dans trois répertoires différents.
Le script t'affiche lesquels sont identiques en contenu, que le nom de fichier soit identique ou pas.
Édité par Jybz Le 05/04/2020 à 23h44
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

mabthera Membre non connecté
-
- Voir le profil du membre mabthera
- Inscrit le : 10/06/2019
- Groupes :
J'ai commencé à la manu, avec le gestionnaire de fichiers. Je parcours les sous-répertoires un à un d'un répertoire (REP1) et je transfère tout à la racine. C'est assez long parce qu'il y a beaucoup de sous-répertoires (120 à 150 pour un petit REP). Ensuite je transférerai REP2 dans REP1 et ainsi de suite.
Pour les nombreux noms de fichiers génériques (IMGxxx, imgxxx, xxx), je les change par bloc en introduisant une partie du nom du sous-répertoire (ie IMG_0008.jpg -> toto_0008.jpg, 108.jpg -> 108_toto.jpg). C'est très long.
Pour REP1, peu de doublons sur 2000 ou 3000 fichiers, mais il y en aura de plus en plus, donc les renommages partent à la poubelle (sauf si je renomme différemment, mais cela fait un doublon qui ne se voit pas). C'est très répétitif parce que les renommages sont toujours les mêmes : seul le nom du sous-répertoire change, mais de REP en REP, il y a beaucoup de sous-répertoires au nom identique (avec un contenu qui change au moins en nombre).

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Code BASH :
#!/bin/bash -x #Ce script : # déplace tous les fichiers de tous les sous dossiers d'un dossier origine # vers un unique dossier. # Dans là cas où un fichier porte déjà le même nom, # le script rajoute .X à la fin, où X est un nombre qui s'incrémente. DOSSIER_ORIGINE="/home/${USER}/tmp/origine" DOSSIER_UNIQUE="/home/${USER}/tmp/unique" # On fait une liste de fichier à déplacer : LISTE_FICHIERS=$(find "${DOSSIER_ORIGINE}" -type f -name "*") # On parcours la liste for FICHIER in ${LISTE_FICHIERS} ; do # et vérifie qu'il n'existe pas déjà dans le dossier unique, # Avant ça, on récupère le nom du fichier sans son chemin : NOM_FICHIER=$(basename ${FICHIER}) # Vérification de l'existance à la destination : if [ -e ${DOSSIER_UNIQUE}/${NOM_FICHIER} ] ; then # On incrémente un compteur qu'on initialise à zero COMPTEUR=0 # tant que les fichiers à la destination existe, on l'incrémente while [ -e ${DOSSIER_UNIQUE}/${NOM_FICHIER}.${COMPTEUR} ] ; do COMPTEUR=$((${COMPTEUR}+1)) done #Lorsque le fichier à la destination n'existe pas déjà, #on peut l'utiliser pour le nouveau nom de fichier mv ${FICHIER} ${DOSSIER_UNIQUE}/${NOM_FICHIER}.${COMPTEUR} #S'il n'existe pas déjà un fichier du même nom, else #On l'y colle simplement: mv ${FICHIER} ${DOSSIER_UNIQUE}/${NOM_FICHIER} fi done #Fin du script, la liste des fichiers à été parcourue. #On peut quitter avec le code de retour 0 (tout va bien). exit 0
Environnement de test :
Code TEXT :
[jybz@localhost tmp]$ tree . ├── img2.jpg ├── origine │ ├── dossierA │ │ └── img2.jpg │ ├── dossierB │ │ └── img2.jpg │ ├── dossierC │ │ ├── img2.jpg │ │ └── sousDossierC │ │ └── img2.jpg │ └── img2.jpg └── unique
Exécution du script :
Code TEXT :
[jybz@localhost menage]$ ./DeplacementFichierUniqueDossier.sh + DOSSIER_ORIGINE=/home/jybz/tmp/origine + DOSSIER_UNIQUE=/home/jybz/tmp/unique ++ find /home/jybz/tmp/origine -type f -name '*' + LISTE_FICHIERS='/home/jybz/tmp/origine/img2.jpg /home/jybz/tmp/origine/dossierA/img2.jpg /home/jybz/tmp/origine/dossierC/img2.jpg /home/jybz/tmp/origine/dossierC/sousDossierC/img2.jpg /home/jybz/tmp/origine/dossierB/img2.jpg' + for FICHIER in ${LISTE_FICHIERS} ++ basename /home/jybz/tmp/origine/img2.jpg + NOM_FICHIER=img2.jpg + '[' -e /home/jybz/tmp/unique/img2.jpg ']' + mv /home/jybz/tmp/origine/img2.jpg /home/jybz/tmp/unique/img2.jpg + for FICHIER in ${LISTE_FICHIERS} ++ basename /home/jybz/tmp/origine/dossierA/img2.jpg + NOM_FICHIER=img2.jpg + '[' -e /home/jybz/tmp/unique/img2.jpg ']' + COMPTEUR=0 + '[' -e /home/jybz/tmp/unique/img2.jpg.0 ']' + mv /home/jybz/tmp/origine/dossierA/img2.jpg /home/jybz/tmp/unique/img2.jpg.0 + for FICHIER in ${LISTE_FICHIERS} ++ basename /home/jybz/tmp/origine/dossierC/img2.jpg + NOM_FICHIER=img2.jpg + '[' -e /home/jybz/tmp/unique/img2.jpg ']' + COMPTEUR=0 + '[' -e /home/jybz/tmp/unique/img2.jpg.0 ']' + COMPTEUR=1 + '[' -e /home/jybz/tmp/unique/img2.jpg.1 ']' + mv /home/jybz/tmp/origine/dossierC/img2.jpg /home/jybz/tmp/unique/img2.jpg.1 + for FICHIER in ${LISTE_FICHIERS} ++ basename /home/jybz/tmp/origine/dossierC/sousDossierC/img2.jpg + NOM_FICHIER=img2.jpg + '[' -e /home/jybz/tmp/unique/img2.jpg ']' + COMPTEUR=0 + '[' -e /home/jybz/tmp/unique/img2.jpg.0 ']' + COMPTEUR=1 + '[' -e /home/jybz/tmp/unique/img2.jpg.1 ']' + COMPTEUR=2 + '[' -e /home/jybz/tmp/unique/img2.jpg.2 ']' + mv /home/jybz/tmp/origine/dossierC/sousDossierC/img2.jpg /home/jybz/tmp/unique/img2.jpg.2 + for FICHIER in ${LISTE_FICHIERS} ++ basename /home/jybz/tmp/origine/dossierB/img2.jpg + NOM_FICHIER=img2.jpg + '[' -e /home/jybz/tmp/unique/img2.jpg ']' + COMPTEUR=0 + '[' -e /home/jybz/tmp/unique/img2.jpg.0 ']' + COMPTEUR=1 + '[' -e /home/jybz/tmp/unique/img2.jpg.1 ']' + COMPTEUR=2 + '[' -e /home/jybz/tmp/unique/img2.jpg.2 ']' + COMPTEUR=3 + '[' -e /home/jybz/tmp/unique/img2.jpg.3 ']' + mv /home/jybz/tmp/origine/dossierB/img2.jpg /home/jybz/tmp/unique/img2.jpg.3 + exit 0
Résultat :
Code TEXT :
[jybz@localhost tmp]$ tree . ├── img2.jpg ├── origine │ ├── dossierA │ ├── dossierB │ └── dossierC │ └── sousDossierC └── unique ├── img2.jpg ├── img2.jpg.0 ├── img2.jpg.1 ├── img2.jpg.2 └── img2.jpg.3
Alors :
Le script à bien déplacé tous les fichiers de tous les dossiers et sous-dossiers du dossier "origine" vers "unique" sans sous dossiers, aucun dossier n'a été déplacé, les fichiers du même on un préfix .0, .1 ainsi de suite jusqu'à ce que le nom de fichier soit disponible.
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Hodos Membre non connecté
-
- Voir le profil du membre Hodos
- Inscrit le : 17/04/2014
- Groupes :

Je suis peut-être "à côté de la plaque", mais on peut utiliser FreeFileSynchro pour ce genre de "travail".
La fonction "synchroniser" permet soit : 2 sens, miroir, mise à jour, personnaliser.
Bref, dans le cas précis d'aujourd'hui ce n'est peut-être pas adapté....
MSI CR70 2M-207, 17.3" sans OS à l'achat avec Pentium Dual Core Haswell CPU 3550m, 500 Go

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
En second test, cette fois si, je mets 3 fichiers différents, dont 2 que je duplique dans deux autres dossiers, je les nommes tous d'un nom différent.
Ainsi, j'ai 5 fichiers "différents" (de nom).
Code TEXT :
[jybz@localhost tmp]$ tree . ├── origine │ ├── dossierA │ │ └── fichier2.png │ ├── dossierB │ │ └── fichier1-nom1.jpg │ ├── dossierC │ │ ├── fichier3-nom2.png │ │ └── sousDossierC │ │ └── fichier1-nom2.jpg │ └── fichier3-nom1.png └── unique
5 fichiers :
fichier1-nom1.jpg
fichier1-nom2.jpg
fichier2.png
fichier3-nom1.png
fichier3-nom2.png
Après le premier script :
Code TEXT :
[jybz@localhost tmp]$ tree . ├── origine │ ├── dossierA │ ├── dossierB │ └── dossierC │ └── sousDossierC └── unique ├── fichier1-nom1.jpg ├── fichier1-nom2.jpg ├── fichier2.png ├── fichier3-nom1.png └── fichier3-nom2.png
On a bien 5 fichiers de nom différents, donc "aucun doublon".
Voici le script utilisé :
Code BASH :
#!/bin/bash -x #Ce script : # déplace supprime tous les doublons en "contenu" d'un dossier, basé sur la somme MD5 DOSSIER="/home/${USER}/tmp/unique" CALCULE=md5sum # On liste tous les fichiers (sans prendre en compte les dossiers), # Attention, on vient aussi lister les fichiers dans les sous-dossiers ! LISTE_FICHIERS=$(find "${DOSSIER}" -type f -name "*") #On crée un fichier temporaire qui contiendra la liste des sommes et des fichiers LISTE_HASH_FICHIERS=$(mktemp) #On crée un autre fichier temporaire contenant que la liste des fichiers à supprimer LISTE_SUPPRESSION=$(mktemp) # On parcours la liste, for FICHIER in ${LISTE_FICHIERS} ; do #Comme calculer des sommes prends un temps non négligeable, #on la calcule pour tous les fichiers une seule et unique fois. #On ajoute chaque somme au fichier contenant la liste. ${CALCULE} ${FICHIER} >> ${LISTE_HASH_FICHIERS} done #On génère une liste avec uniquement les sommes, # On coupe pour ne récupérer que la première partie, # On trie par numéro du HASH, # On ne garde qu'une unique occurence LISTE_HASH=$(cat ${LISTE_HASH_FICHIERS} | cut -d ' ' -f 1 | sort | uniq) # On parcours la liste des sommes, for HASH in ${LISTE_HASH} ; do #On regarde le nombre de fois que la somme existe dans la liste FICHIERS_IDENTIQUES=$(grep ${HASH} ${LISTE_HASH_FICHIERS}) NOMBRE=$(echo "${FICHIERS_IDENTIQUES}" | wc -l) #S'il y en a plus d'un, on supprime les doublons... if [ ${NOMBRE} -gt 1 ] ; then #On supprime la première ligne de la liste d'un doublon, donc le premier fichier #Et on génère une liste de fichiers à supprimer. #Nous avons à chaque ligne une somme, des espaces puis le nom de fichier à supprimer, #donc pour chaque ligne, nous remplaçons son début de ligne commençant par une chaine de caractère alpha numérique # puis suivit d'espaces, par rien. grep ${HASH} ${LISTE_HASH_FICHIERS} | sed -e '1d' | sed -e 's/^[[:alnum:]]*[[:space:]]*//' >>${LISTE_SUPPRESSION} fi done # On parcours la liste des doublons, for DOUBLON in $(cat ${LISTE_SUPPRESSION}) ; do #On supprime les fichiers doublons rm -f ${DOUBLON} done #On supprime les fichiers temporaires rm -f ${LISTE_HASH_FICHIERS} ${LISTE_SUPPRESSION} exit 0
Son exécution :
Code TEXT :
[jybz@localhost menage]$ ./SuppressionFichierDoublonMD5.sh + DOSSIER=/home/jybz/tmp/unique + CALCULE=md5sum ++ find /home/jybz/tmp/unique -type f -name '*' + LISTE_FICHIERS='/home/jybz/tmp/unique/fichier3-nom1.png /home/jybz/tmp/unique/fichier2.png /home/jybz/tmp/unique/fichier1-nom1.jpg /home/jybz/tmp/unique/fichier1-nom2.jpg /home/jybz/tmp/unique/fichier3-nom2.png' ++ mktemp + LISTE_HASH_FICHIERS=/tmp/tmp.zR4LgYAwjA ++ mktemp + LISTE_SUPPRESSION=/tmp/tmp.ZbFXWrj0UI + for FICHIER in ${LISTE_FICHIERS} + md5sum /home/jybz/tmp/unique/fichier3-nom1.png + for FICHIER in ${LISTE_FICHIERS} + md5sum /home/jybz/tmp/unique/fichier2.png + for FICHIER in ${LISTE_FICHIERS} + md5sum /home/jybz/tmp/unique/fichier1-nom1.jpg + for FICHIER in ${LISTE_FICHIERS} + md5sum /home/jybz/tmp/unique/fichier1-nom2.jpg + for FICHIER in ${LISTE_FICHIERS} + md5sum /home/jybz/tmp/unique/fichier3-nom2.png ++ cat /tmp/tmp.zR4LgYAwjA ++ cut -d ' ' -f 1 ++ sort ++ uniq + LISTE_HASH='4c36cb4caa2174ada07f9268ea4bf4e8 62a023a3ba3156aa09b097230f921ceb 8f556c3f9aa0e80a3f19e0d85736f0d7' + for HASH in ${LISTE_HASH} ++ grep 4c36cb4caa2174ada07f9268ea4bf4e8 /tmp/tmp.zR4LgYAwjA + FICHIERS_IDENTIQUES='4c36cb4caa2174ada07f9268ea4bf4e8 /home/jybz/tmp/unique/fichier1-nom1.jpg 4c36cb4caa2174ada07f9268ea4bf4e8 /home/jybz/tmp/unique/fichier1-nom2.jpg' ++ echo '4c36cb4caa2174ada07f9268ea4bf4e8 /home/jybz/tmp/unique/fichier1-nom1.jpg 4c36cb4caa2174ada07f9268ea4bf4e8 /home/jybz/tmp/unique/fichier1-nom2.jpg' ++ wc -l + NOMBRE=2 + '[' 2 -gt 1 ']' + grep 4c36cb4caa2174ada07f9268ea4bf4e8 /tmp/tmp.zR4LgYAwjA + sed -e 1d + sed -e 's/^[[:alnum:]]*[[:space:]]*//' + for HASH in ${LISTE_HASH} ++ grep 62a023a3ba3156aa09b097230f921ceb /tmp/tmp.zR4LgYAwjA + FICHIERS_IDENTIQUES='62a023a3ba3156aa09b097230f921ceb /home/jybz/tmp/unique/fichier2.png' ++ echo '62a023a3ba3156aa09b097230f921ceb /home/jybz/tmp/unique/fichier2.png' ++ wc -l + NOMBRE=1 + '[' 1 -gt 1 ']' + for HASH in ${LISTE_HASH} ++ grep 8f556c3f9aa0e80a3f19e0d85736f0d7 /tmp/tmp.zR4LgYAwjA + FICHIERS_IDENTIQUES='8f556c3f9aa0e80a3f19e0d85736f0d7 /home/jybz/tmp/unique/fichier3-nom1.png 8f556c3f9aa0e80a3f19e0d85736f0d7 /home/jybz/tmp/unique/fichier3-nom2.png' ++ echo '8f556c3f9aa0e80a3f19e0d85736f0d7 /home/jybz/tmp/unique/fichier3-nom1.png 8f556c3f9aa0e80a3f19e0d85736f0d7 /home/jybz/tmp/unique/fichier3-nom2.png' ++ wc -l + NOMBRE=2 + '[' 2 -gt 1 ']' + grep 8f556c3f9aa0e80a3f19e0d85736f0d7 /tmp/tmp.zR4LgYAwjA + sed -e 1d + sed -e 's/^[[:alnum:]]*[[:space:]]*//' ++ cat /tmp/tmp.ZbFXWrj0UI + for DOUBLON in $(cat ${LISTE_SUPPRESSION}) + rm -f /home/jybz/tmp/unique/fichier1-nom2.jpg + for DOUBLON in $(cat ${LISTE_SUPPRESSION}) + rm -f /home/jybz/tmp/unique/fichier3-nom2.png + rm -f /tmp/tmp.zR4LgYAwjA /tmp/tmp.ZbFXWrj0UI + exit 0
Le résultat :
Code TEXT :
[jybz@localhost tmp]$ tree . ├── origine │ ├── dossierA │ ├── dossierB │ └── dossierC │ └── sousDossierC └── unique ├── fichier1-nom1.jpg ├── fichier2.png └── fichier3-nom1.png
Nous avons bien supprimé les fichiers identiques.
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

mabthera Membre non connecté
-
- Voir le profil du membre mabthera
- Inscrit le : 10/06/2019
- Groupes :
Je crois qu'il y a eu d'autres messages, le temps que j'écrive le mien...
J'ai essayé, cela marche, mais pas complètement. Je crois qu'il saucissonne les noms de fichiers et de répertoires qui présentent un espace (en principe, j'évite de mettre des espaces, mais je récupère beaucoup de fichiers d'ailleurs) et ne les trouve pas (336 fichiers restants dans origine et 2701 dans unique) :
mv: impossible d'évaluer '/home/toto/tmp/origine/SANTE/semaine': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'contre': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'le': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'cancer.pdf': Aucun fichier ou dossier de ce type
...
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/bulletin_2013_2.jpg": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/bulletin-LJA.jpg": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/CV": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC.rtf": Aucun fichier ou dossier de ce type
...
PS : j'ai remplacé 2 prénoms par toto et tata
Par ailleurs, mon idée de renommer les noms de fichiers génériques en accolant une partie du nom du répertoire était bonne (ie IMG_0008.jpg -> titi_0008.jpg, 108.jpg -> 108_tonton.jpg), parce que cela me donne idée de l'objet du fichier document. Mais, je peux préparer le répertoire avant. De même pour les noms comportant des espaces.
Encore merci et bonne journée !
Édité par mabthera Le 06/04/2020 à 13h13

moment magnetique Membre non connecté
-
- Voir le profil du membre moment magnetique
- Inscrit le : 06/10/2012
- Groupes :
oui c'est à cause du IFS (internal field separator ) , il faut modifier cette variable avant la boucle for
normalement dans IFS il y a i) l'espace ,ii) tabulation \t et iii) le retour \n .On enleve l'espace en écrivant
IFS=$'\t\n' avant la boucle for .
Édité par moment magnetique Le 06/04/2020 à 15h00

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
mabthera :
J'ai essayé, cela marche, mais pas complètement. Je crois qu'il saucissonne les noms de fichiers et de répertoires qui présentent un espace (en principe, j'évite de mettre des espaces, mais je récupère beaucoup de fichiers d'ailleurs) et ne les trouve pas (336 fichiers restants dans origine et 2701 dans unique) :
mv: impossible d'évaluer '/home/toto/tmp/origine/SANTE/semaine': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'contre': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'le': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'cancer.pdf': Aucun fichier ou dossier de ce type
...
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/bulletin_2013_2.jpg": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/bulletin-LJA.jpg": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/CV": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC.rtf": Aucun fichier ou dossier de ce type
...
mv: impossible d'évaluer '/home/toto/tmp/origine/SANTE/semaine': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'contre': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'le': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'cancer.pdf': Aucun fichier ou dossier de ce type
...
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/bulletin_2013_2.jpg": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/bulletin-LJA.jpg": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer '/home/toto/tmp/origine/tata/JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC/CV": Aucun fichier ou dossier de ce type
mv: impossible d'évaluer 'JEANNE': Aucun fichier ou dossier de ce type
mv: impossible d'évaluer "D'ARC.rtf": Aucun fichier ou dossier de ce type
...
Ah ! Ok, je pense qu'il suffit de rajouter IFS=$'\n' juste avant !

Code BASH :
#!/bin/bash -x #Ce script : # déplace tous les fichiers de tous les sous dossiers d'un dossier origine # vers un unique dossier. # Dans là cas où un fichier porte déjà le même nom, # le script rajoute .X à la fin, où X est un nombre qui s'incrémente. DOSSIER_ORIGINE="/home/${USER}/tmp/origine" DOSSIER_UNIQUE="/home/${USER}/tmp/unique" # On fait une liste de fichier à déplacer : LISTE_FICHIERS=$(find "${DOSSIER_ORIGINE}" -type f -name "*") #On redéfini le "séparateur" par une ligne au lieu de "n'importe quoi". #EDIT : MomentMagnétique l'explique bien mieux que moi, je découvre ses compétences ;) IFS=$'\n' # On parcours la liste for FICHIER in ${LISTE_FICHIERS} ; do # et vérifie qu'il n'existe pas déjà dans le dossier unique, # Avant ça, on récupère le nom du fichier sans son chemin : NOM_FICHIER=$(basename ${FICHIER}) # Vérification de l'existance à la destination : if [ -e ${DOSSIER_UNIQUE}/${NOM_FICHIER} ] ; then # On incrémente un compteur qu'on initialise à zero COMPTEUR=0 # tant que les fichiers à la destination existe, on l'incrémente while [ -e ${DOSSIER_UNIQUE}/${NOM_FICHIER}.${COMPTEUR} ] ; do COMPTEUR=$((${COMPTEUR}+1)) done #Lorsque le fichier à la destination n'existe pas déjà, #on peut l'utiliser pour le nouveau nom de fichier mv ${FICHIER} ${DOSSIER_UNIQUE}/${NOM_FICHIER}.${COMPTEUR} #S'il n'existe pas déjà un fichier du même nom, else #On l'y colle simplement: mv ${FICHIER} ${DOSSIER_UNIQUE}/${NOM_FICHIER} fi done #Fin du script, la liste des fichiers à été parcourue. #On peut quitter avec le code de retour 0 (tout va bien). exit 0
Édité par Jybz Le 06/04/2020 à 15h07
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie