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

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Reprise du message précédent
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 |

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 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 se prémunie des espaces : IFS=$'\n' # 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
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 :
# déplace supprime tous les doublons en "contenu" d'un dossier, basé sur la somme MD5
DOSSIER="/home/${USER}/tmp/unique"
DOSSIER="/home/${USER}/tmp/unique"
Ton dossier de départ est paramétrable ou prédéfini dans le script?

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
C'est l'unique endroit où c'est défini !
Par contre !
C'est TOI qui m'y fait pensé avec tes essais de wiki, je ne connais pas le comportement par défaut du script avec les liens symboliques !
J'espère qu'il ne les suis pas... ^^ En fonction du nom donné, il se peut qu'il supprime l'original et ne garde que le fichier lien

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
Si c'est ce que tu veux,
remplace
DOSSIER="/home/${USER}/tmp/unique"
par
DOSSIER="${1}"
ça prendra le premier argument, du genre :
./LeScriptDeSuppressionDeDoublon /mnt/winc/documents
viendra mettre la variable "DOSSIER" à /mnt/winc/documents lors du lancement du script.
à savoir :
${0} c'est dans notre exemple "./LeScriptDeSuppressionDeDoublon"
${1} c'est le dossier donné
${2} n'existe pas
${#} est égale au nombre d'argument définit (donc 1)
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 |
![:] :]](/images/smileys/8.gif)

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Tu lances le script, il affiche un message d'accueil, demande le dossier à analyser, puis on doit taper (sans autocompletion, ça ne marche pas à l'intérieur d'un script) ?
Ou on garde une méthode "en argument", par exemple :
./leScript.sh --dossier /chemin/dossier
Avec une vérification que ce soit bien un dossier?
Qu'en est-il des liens symboliques ?
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
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