Contenu | Rechercher | Menus

Annonce

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.

À propos de l'équipe du forum.

#1 Le 30/01/2015, à 21:57

Gaara

[résolu] Script pour déplacer fichiers orphelins

Salut à tous,

Ceci est une demande de script...
J'aimerais un petit programme pour déplacer certains fichiers d'un répertoire, mais seulement ceux dont le nom (du moins les 10 premier caractères) n'est pas en double, avec une extension différente.
Je m'explique:

Fichier1_avec_10_caractères.txt         # non déplacé
Fichier1_avec_10_caractères.jpg              # non déplacé
Fichier2_seul.jpg          # pas en double, donc déplacé
Fichier3_en_double.doc                              # non déplacé
Fichier3_en_double.png                               # non déplacé

etc..
J'ai 600 Go à traiter tongue
Si une bonne âme pourrait m'aider à écrire ça smile

Merci !

Dernière modification par Gaara (Le 31/01/2015, à 00:10)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#2 Le 30/01/2015, à 22:23

nany

Re : [résolu] Script pour déplacer fichiers orphelins

Bonsoir,

copy=$(ls <PATH_TO_COPY> | awk -F. '{print $1}' | uniq -u)
for file in $copy ; do cp <PATH_TO_COPY>/${file}.* <PATH_TO_PASTE>/ ; done

Adapter <PATH_TO_COPY> et <PATH_TO_PASTE> aux chemins désirés.

Dernière modification par nany (Le 30/01/2015, à 22:23)

Hors ligne

#3 Le 30/01/2015, à 22:27

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

Merci beaucoup, je teste de suite


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#4 Le 30/01/2015, à 22:35

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

Ah oui j'oubliais...
Certains noms de fichiers comportent des espaces..
Du coup j'obtiens

cp: impossible d'évaluer « /home/chemin/le.* »: Aucun fichier ou dossier de ce type

Autre question: ça prend en compte le nom complet ou juste une partie? -> avec le nom complet ça devrait fonctionner quand même, c'est juste par curiosité

Dernière modification par Gaara (Le 30/01/2015, à 22:38)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#5 Le 30/01/2015, à 22:53

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

Est-ce que cette ligne fonctionnerait?

copy=$(ls <PATH_TO_COPY> | awk -F. '{ sub(/ /," "); print $1}' | uniq -u)

(source)
Edit: sinon, si les espaces sont supprimés, c'est pas grave

Dernière modification par Gaara (Le 30/01/2015, à 22:54)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#6 Le 30/01/2015, à 23:09

nany

Re : [résolu] Script pour déplacer fichiers orphelins

Ça prend en compte le nom complet amputé de l’extension.
Et effectivement ça ne marche pas avec des espaces.

Non, la substitution ne peut pas se faire ici.

Pour prendre les dix premiers caratères (s’il n’y a pas d’espace) :

copy=$(ls <PATH_TO_COPY> | awk -F. '{print substr ($1, 0, 10)}' | uniq -u)
for file in $copy ; do cp <PATH_TO_COPY>/"${file}"*.* <PATH_TO_PASTE>/ ; done

Dernière modification par nany (Le 30/01/2015, à 23:10)

Hors ligne

#7 Le 31/01/2015, à 00:09

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

Donc j'ai fait avec 4 caractères et avec mv au lieu de cp.
Ensuite j'ai remis les fichiers déplacés par erreur dans le bon dossier manuellement, ça m'a pris 5 min.

Problème résolu, et 120Go de données déplacées!
Merci beaucoup smile


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#8 Le 31/01/2015, à 00:35

pingouinux

Re : [résolu] Script pour déplacer fichiers orphelins

Bonsoir,
@nany #6 : Si tu as ces 3 fichiers

uniq.jpg   # qui devrait être déplacéé
uniq_1.jpg # qui ne devrait pas l'être
uniq_1.txt # qui ne devrait pas l'être

ils seront tous déplacés

Je propose ce script en python

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys, os, shutil

rep1=sys.argv[1] # Répertoire de départ
rep2=sys.argv[2] # Répertoire d'arrivée

dico={}
liste=os.listdir(rep1) # Liste des fichiers

for fic in liste :
   rac=os.path.splitext(fic)[0][:10] # 10 carac du nom sans l'extension
   dico[rac]=dico.setdefault(rac,0)+1 # On compte le nombre de fois où la racine du nom apparaît

for fic in liste :
   rac=os.path.basename(os.path.splitext(fic)[0])[:10] # 10 carac du nom sans l'extension
   if dico[rac]==1 :
      try : shutil.move(os.path.join(rep1,fic),rep2) # Déplacement du fichier
      except shutil.Error as val : print(val)

À appeler ainsi

./script.py rep_initial rep_destination

Hors ligne

#9 Le 31/01/2015, à 01:07

nany

Re : [résolu] Script pour déplacer fichiers orphelins

Au temps pour moi, j’avais mis une copie plutôt qu’un déplacement.

@pigouinux : c’est effectivement ce qui est arrivé à Gaara qui n’a pris que les quatre premiers caractères au lieu de dix.
Enfin, pour ton exemple, c’est plutôt le contraire ; aucun déplacement n’est fait alors qu’il devrait y en avoir un.

Sinon, pour la gestion des espaces, on aurait pu procéder à une double substitution :

copy=$(ls <PATH_TO_COPY> | awk -F. '{ gsub (" ", "_", $1);print $1 }' | uniq -u)
for file in $copy ; do mv <PATH_TO_COPY>/"${file//_/ }".* <PATH_TO_PASTE>/ ; done

Ici, « _ » est pris comme caractère de substitution. S’il est présent dans les noms de fichiers, il faut en choisir un autre.

Dernière modification par nany (Le 31/01/2015, à 01:07)

Hors ligne

#10 Le 31/01/2015, à 01:46

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

@pingouinux:
Ton script a trouvé d'autres entrées, et le 2eme script de nany aussi ! (effectués l'un après l'autre)
Je vais tout refaire demain car là je ne sais plus ou j'en suis.
Merci


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#11 Le 31/01/2015, à 10:43

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

Alors.. me revoilà en forme avec les résultats, et le dossier d'origine:

-Script de pingouinux: 190 éléments déplacés sur 639, pas d'erreur. ça m'a l'air parfait, rien a modifier smile
-Script de nany: 221 éléments déplacés, mais avec des erreurs au terminal, et ça a déplacé des fichiers qui n'auraient pas dû l'être.
Mais ça doit être à cause des dossiers présents, que je n'avait pas mentionné au départ.

Bref, c'est doublement résolu mon truc. Je vais pouvoir lancer un cron tous les 15 jours pour automatiser ça.
Merci encore à vous 2


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#12 Le 31/01/2015, à 11:57

pingouinux

Re : [résolu] Script pour déplacer fichiers orphelins

nany #9 a écrit :

Enfin, pour ton exemple, c’est plutôt le contraire ; aucun déplacement n’est fait alors qu’il devrait y en avoir un.

Je viens de refaire le test. Avec ces fichiers

uniq.jpg   # qui devrait être déplacéé
uniq_1.jpg # qui ne devrait pas l'être
uniq_1.txt # qui ne devrait pas l'être

0 déplacement avec 4 caractères, 3 si on en prend 10.

Voici une version légèrement améliorée de mon script

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys, os, shutil

rep1=sys.argv[1] # Répertoire de départ
rep2=sys.argv[2] # Répertoire d'arrivée

dico={}
liste=os.listdir(rep1) # Liste des fichiers

# 10 carac du nom sans l'extension
def racine(fic) : return os.path.splitext(fic)[0][:10]

for fic in liste :
   rac=racine(fic)
   dico[rac]=dico.get(rac,0)+1 # On compte le nombre de fois où la racine du nom apparaît

for fic in liste :
   rac=racine(fic)
   if dico[rac]==1 :
    # Message si le fichier existe déjà dans le répertoire de destination
      try : shutil.move(os.path.join(rep1,fic),rep2) # Déplacement du fichier
      except shutil.Error as val : print(val)

Hors ligne

#13 Le 31/01/2015, à 14:58

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

Oui mais en fait avec le nom du fichier entier c'est aussi bien.
Je vais l'agrémenter avec notify-send (ou py-notify plutôt) smile

C'est codé en python 3 ou python 2 ? Car en python 2 le print n'est pas suivi de (), mais ton shebang est en 2.
Et pour le lancer c'est le 2 que j'ai utilisé.. Je comprend pas trop là hmm

Dernière modification par Gaara (Le 31/01/2015, à 14:59)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#14 Le 31/01/2015, à 15:34

pingouinux

Re : [résolu] Script pour déplacer fichiers orphelins

Le script tourne en python2 et python3. La syntaxe du print() est commune aux deux.

Hors ligne

#15 Le 31/01/2015, à 15:41

Gaara

Re : [résolu] Script pour déplacer fichiers orphelins

Ah ok !


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#16 Le 31/01/2015, à 17:30

nany

Re : [résolu] Script pour déplacer fichiers orphelins

pingouinux a écrit :

[…]
0 déplacement avec 4 caractères, 3 si on en prend 10.
[…]

Conclusion, la fonction substr de awk n’est pas top.


Gaara a écrit :

[…]
-Script de nany: […]

Ce n’était pas vraiment un script mais plutôt deux lignes de commande à la volée. wink
Bon, puisque j’avais un peu de temps libre, j’y suis allé de mon petit script bash avec ceci comme cahier des charges :

Gaara a écrit :

Oui mais en fait avec le nom du fichier entier c'est aussi bien.
[…]

Gaara a écrit :

[…]
Certains noms de fichiers comportent des espaces..
[…]

Gaara a écrit :

[…]
Mais ça doit être à cause des dossiers présents, que je n'avait pas mentionné au départ.
[…]

#!/bin/bash

ARGS=2
E_BADARGS=85

if [ $# -ne "$ARGS" ]
then
  echo "Usage : `basename $0` /chemin/source /chemin/destination"
  exit $E_BADARGS
fi

source=$1
dest=$2
cpt=0
## suppression des espaces dans les noms des fichiers sans extension
nospfiles=$(ls $source | awk -F. '{ gsub (" ", "%20", $1) ; print $1 }')
## ne pas prendre en compte les doublons
files_to_move=($(echo "$nospfiles" | uniq -u))

for file in "${files_to_move[@]}"
do
## remettre les espaces
spfile=$(echo ${file//%20/ })
## si ce n’est pas un répertoire, déplacement et incrémentation du compteur
  if [ ! -d "$source/$spfile" ] ; then
    mv "$source/$spfile"* "$dest/"
    ((cpt++))
  fi
done

## affichage du nombre de fichiers déplacés
case $cpt in
0)
  echo "Aucun fichier n’a été déplacé."
  ;;
1)
  echo "$cpt fichier déplacé."
  ;;
*)
  echo "$cpt fichiers déplacés."
  ;;
esac

exit 0

Hors ligne