#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
Si une bonne âme pourrait m'aider à écrire ça
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
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
-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
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)
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à
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
[…]
0 déplacement avec 4 caractères, 3 si on en prend 10.
[…]
Conclusion, la fonction substr de awk n’est pas top.
[…]
-Script de nany: […]
Ce n’était pas vraiment un script mais plutôt deux lignes de commande à la volée.
Bon, puisque j’avais un peu de temps libre, j’y suis allé de mon petit script bash avec ceci comme cahier des charges :
Oui mais en fait avec le nom du fichier entier c'est aussi bien.
[…]
[…]
Certains noms de fichiers comportent des espaces..
[…]
[…]
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