Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

déplacer des fichiers

13 réponses
Avatar
Jean-Jacques Gerbaud
Bonjour,

Je suis nul en programmation et guère mieux en Linux.

Je suis toujours à la récupération de mes fichiers effacés par
inadvertance. Ca ne se présente pas aussi bien que ce que j'espérais mais
bon, je continue à chercher.

Photorec ma retrouvé pas mal de fichiers classés maintenant dans une
partition /sauvetage. Il y a 250 fichiers (de recup_dir.1 à recup_dir.250)
contenant chacun environ 500 fichiers qui se présentent sous la forme :
f15042008 à f15892059). Ils ont tous une extension différente (txt, elf. gz,
odt, etc...)

Je voudrais grouper tous les fichiers .txt de tous les répertoires (de 1 à
250) dans un fichier recup.txt unique, et faire de même pour chaque
extension de manière à me faciliter la vie.

J'ai réussi à faire un script bash (recuperation.txt) qui se présente ainsi :

find /sauvetage/recup* -iname ".txt" -exec mv -t /sauvetage/recup.txt '{}' \;

Ce fichier (que j'ai rendu exécutable (chmod +x) se trouve au milieu de tous
les répertoires recup_dirxxx) mais la commande

./recuperation.txt

est absolument inopérante. Et il n'y a aucune indication d'erreur qui puisse
me donner une piste de recherche. Je pense que le système ne peut pas
chercher dans le fichier "recup_dir.*" mais qu'il lui faut un chemin bien
précis et correct pour commencer la recherche.

Je m'en remets à vous pour me dire ce qui ne va pas dans mon script. Ou
alors m'en donner un plus efficace.

Peut être que je devrais le mettre ailleurs ? Changer les droits, de
propriétaire ?

Je vous remercie d'avance de vos conseils


--
Jean-Jacques Gerbaud
entre Dauphiné et PACA

10 réponses

1 2
Avatar
Francois Lafont
Bonjour,

Le 03/03/2011 23:49, Jean-Jacques Gerbaud a écrit :

find /sauvetage/recup* -iname ".txt" -exec mv -t /sauvetage/recup.txt
'{}' ;



Je pense que ceci marchera mieux :

find /sauvetage/recup* -type f -iname "*.txt" -exec mv -t
/sauvetage/recup.txt '{}' ;

(il faut mettre un « * » devant « .txt » sinon find cherche un fichier
qui s'appelle '.txt' [à la casse près] et ne trouve rien.)

J'ai rajouté « type -f » pour que find se limite à la recherche de
fichiers de type standard (pas des dossiers etc).

Bon courage pour la suite.



--
François Lafont
Avatar
yamo'
Jean-Jacques Gerbaud a tapoté, le 03/03/2011 23:49:
find /sauvetage/recup* -iname ".txt" -exec mv -t /sauvetage/recup.txt '{}' ;



recup.txt est un répertoire?



Ce serais plutôt (pas testé la commande et je n'ai pas regardé le man de
mv pour le t) :

où /sauvetage/recup est le répertoire racine où il y a tous les fichiers
récupérés, il faut que /sauvetage/recup soient différents ( c'est
peut-être idiot mais vaut mieux vérifier des choses bêtes surtout avec
find ) et que le premier ne soit pas le père du deuxième.

find /sauvetage/recup -iname "*.txt" -exec mv -t /sauvetage/recup.txt
'{}' ;


Mais avant je ferais un ls pour vérifier ce que fait la commande :


find /sauvetage/ -iname "*.txt" -exec ls -al /sauvetage/recup.txt '{}' ;


--
Stéphane

<http://pasdenom.info/fortune/>

Descartes, né pour découvrir les erreurs de l'Antiquité, mais pour y
substituer les siennes.
-+- Voltaire -+-
Avatar
yamo'
yamo' a tapoté, le 04/03/2011 00:13:
Mais avant je ferais un ls pour vérifier ce que fait la commande :


find /sauvetage/ -iname "*.txt" -exec ls -al /sauvetage/recup.txt '{}' ;



Il se fait tard (et on ne peut pas faire simplement de supersedes avec
Seamonkey )

Avec -type f comme dit François.

find /sauvetage/ -iname "*.txt" -type f -exec ls -al '{}' ;

Et une fois que la commande a un résultat correct mettre mv (j'ai déjà
fait des chmod hasardeux sur une machine virtuelles avec un find...)



--
Stéphane

<http://pasdenom.info/fortune/>

Le résultat des arguments de Zénon, c'est la démonstration d'une
confusion dans le langage.
-+- Paul Valéry -+-
Avatar
Francois Lafont
Le 04/03/2011 00:06, Francois Lafont a écrit :

find /sauvetage/recup* -iname ".txt" -exec mv -t /sauvetage/recup.txt
'{}' ;





En fait, si /sauvetage ne contient rien d'autre que les dossiers
recup_dir.XXX, alors j'enlèverais le « /recup* » pour faire ça :

find /sauvetage -type f -iname "*.txt" -exec mv -t /sauvetage/recup.txt
'{}' ;

Pour faire un test, lancer l'instruction directement en ligne de
commandes *sans* l'option -exec, ça ne fera qu'afficher les fichiers
recherchés.

Si /sauvetage contient d'autres choses que les dossiers recup_dir.XXX,
alors je tenterais ceci :

find /sauvetage -type f -iregex '/sauvetage/recup_dir.[0-9]+/.*.txt'
-exec -exec mv -t /sauvetage/recup.txt '{}' ;

(Absolument pas testé...)


--
François Lafont
Avatar
Jean-Jacques Gerbaud
Le 04/03/2011 00:06, Francois Lafont a écrit :

Bonjour,

Le 03/03/2011 23:49, Jean-Jacques Gerbaud a écrit :

find /sauvetage/recup* -iname ".txt" -exec mv -t /sauvetage/recup.txt
'{}' ;



Je pense que ceci marchera mieux :

find /sauvetage/recup* -type f -iname "*.txt" -exec mv -t
/sauvetage/recup.txt '{}' ;

(il faut mettre un « * » devant « .txt » sinon find cherche un fichier
qui s'appelle '.txt' [à la casse près] et ne trouve rien.)

J'ai rajouté « type -f » pour que find se limite à la recherche de
fichiers de type standard (pas des dossiers etc).

Bon courage pour la suite.




Oui, effectivement, ça marche mieux car mon répertoire recup.txt est tout de
suite (non, il a fallu attendre quelques minutes quand même :-)) plus riche
de ...43 084 fichiers !!!

En adaptant cette commande, je pourrais directement rechercher les fichiers
qui m'intéressent.

Merci François, c'est bien plus facile que de faire tous les déplacements à
la main !

Merci également à Yamo qui m'a donné sensiblement la même commande que toi.
Mais comme il dit également... "il se fait tard..."

Merci encore
--
Jean-Jacques Gerbaud
entre Dauphiné et PACA
Avatar
Lucas Levrel
Le 3 mars 2011, Jean-Jacques Gerbaud a écrit :

J'ai réussi à faire un script bash (recuperation.txt) qui se présente ainsi :



Mais pourquoi un script et pas simplement taper la ligne dans le
terminal ?

Je m'en remets à vous pour me dire ce qui ne va pas dans mon script. Ou alors
m'en donner un plus efficace.



J'ai vu les autres réponses. Si on est sûr qu'il n'y a que des fichiers,
mmv est ton ami :

mkdir /sauvetage/txt
mmv '/sauvetage/recup*/*.txt' '/sauvetage/txt/#2.txt'


Note qu'en n'appelant pas le répertoire de destination « recup.truc », tu
épargneras du travail à find quand tu trieras ensuite les jpg, pdf, etc.

--
LL
Avatar
Hugues
Ce cher Lucas Levrel a posté :

Le 3 mars 2011, Jean-Jacques Gerbaud a écrit :

J'ai réussi à faire un script bash (recuperation.txt) qui se présente ainsi :



Mais pourquoi un script et pas simplement taper la ligne dans le
terminal ?



C'est plus pratique pour reprendre/corriger/répéter.


Par contre c'est "pourquoi une extension '.txt' pour un shellscript !?"
que je me pose. M'enfin, chacun ses goûts.

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Hugues
Ce cher Olivier Miakinen <om+ a posté :

Le 04/03/2011 13:01, Jean-Jacques Gerbaud a écrit :

J'espère que ma réponse va satisfaire tout le monde.



Le 04/03/2011 14:08, Jean-Jacques Gerbaud a écrit :

J'espère que ma réponse va satisfaire tout le monde.



Le 04/03/2011 14:11, Jean-Jacques Gerbaud a écrit :

J'espère que ma réponse va satisfaire tout le monde.



Surtout Hugues, à qui tu as envoyé ta réponse trois fois par courrier
en même temps que ces trois articles publiés dans le groupe...



Je n'en ai reçu qu'un seul... :0)


Ma récupération se comporte de 250 fichiers (recup_dir.xxx) comportant
chacun 500 fichiers aux extensions diverses et variées (odt, sh, xml, h, a,
pl, txt, elf, etc...)

Mon but est de regrouper tous les fichiers ayant la même extension de
manière à faire un tri plus fin dans chaque répertoire dont les fichiers
auront alors tous la même extension.



Et donc, tu appelles recuperation.txt le script bash censé récupérer les
fichiers .txt, recuperation.h celui qui récupère les fichiers .h,
recuperation.pl celui pour les .pl, et ainsi de suite ?



Il faut croire. :-)
Malheureusement j'ai la flemme de proposer une solution plus propre,
s'adaptant à chaque extension de fichier (facilement récupérable avec
sed par exemple)..

Le mieux étant clairement avec zsh :

for file in recup_dir.???/**(.)
do
mkdir recup_ext.$(file:e)
cp $file recup_ext.$(file:e)/.
done


Le "/." étant ici pour nous assurer qu'on fait bien une copie d'un
fichier dans un dossier, des fois que le mkdir merdoie.. ;o)



C'est clair ?



Moi aussi je trouve ça curieux, même s'il est vrai que bash se fiche pas
mal du nom des fichiers et de leur extension.



Je vois surtout un autre problème : a-t-on la garantie que les fichiers
trouvés dans chacun des dossiers recup_dir.xxx ont un nom *unique* ?
Je n'en suis pas certain... Et il va y avoir des données écrasées
(surtout avec un mv, et sans backup...) :)

Je ne traite absolument pas ce problème dans mon exemple zsh...

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Benoit Izac
Bonjour,

le 04/03/2011 à 14:31, Hugues a écrit dans le message
:

Le mieux étant clairement avec zsh :

for file in recup_dir.???/**(.)
do
mkdir recup_ext.$(file:e)



mkdir -p sinon ça va couiner sévère. De plus, c'est ${file:e}.

cp $file recup_ext.$(file:e)/.
done

Je vois surtout un autre problème : a-t-on la garantie que les fichiers
trouvés dans chacun des dossiers recup_dir.xxx ont un nom *unique* ?
Je n'en suis pas certain... Et il va y avoir des données écrasées
(surtout avec un mv, et sans backup...) :)

Je ne traite absolument pas ce problème dans mon exemple zsh...



i=0
dest="$file"
while [ -f "recup_ext.${file:e}/$dest" ]; do
i=$(($i + 1))
dest="${file:r}_$i.${file:e}"
done
cp "$file" "recup_ext.${file:e}/$dest"

Non testé.

--
Benoit Izac
Avatar
Jean-Claude Marques
Lucas Levrel a écrit :
Le 3 mars 2011, Jean-Jacques Gerbaud a écrit :

J'ai réussi à faire un script bash (recuperation.txt) qui se présente
ainsi :



Mais pourquoi un script et pas simplement taper la ligne dans le terminal ?

Je m'en remets à vous pour me dire ce qui ne va pas dans mon script.
Ou alors m'en donner un plus efficace.



J'ai vu les autres réponses. Si on est sûr qu'il n'y a que des fichiers,
mmv est ton ami :

mkdir /sauvetage/txt
mmv '/sauvetage/recup*/*.txt' '/sauvetage/txt/#2.txt'


Note qu'en n'appelant pas le répertoire de destination « recup.truc »,
tu épargneras du travail à find quand tu trieras ensuite les jpg, pdf, etc.



Bonjour à tous

Mes 2 cents : plutôt qu'un mv, faire un cp, à condition d'avoir
suffisamment d'espace disque, bien sûr.

#### Fichier script shell###

#!/bin/sh


Extensions="tex log" #mettre les extensions ici (sans le point)
Source=$HOME/Latex/articles #le répertoire source (/sauvetage/
Destination="$HOME/COPIES/" #Là où seront stockés les fichiers : je
#proposerais /sauvetage/COPIES ...


for Ext in $Extensions; do
rm -rf $Destination/Rep.$Ext/
mkdir $Destination/Rep.$Ext/
find $Source -type f -iname "*.$Ext" -print
# find $Source -type f -iname "*.$Ext" -exec cp -p {}
$Destination/Rep.$Ext/ ; -ls 2>&1 >$Destination/log.$Ext
done
#### Fin Fichier script shell###


Dans un premier temps, garder le commentaire avant le second find pour
voir ce que cela va faire.

Le dernier find doit être sur une seule ligne ou avec une prolongation
de ligne : "".

Je dois m'absenter quelques dizaines de minutes. Si vous voulez des
précisions, postez, puis je répondrai (ce soir ou alors demain).
1 2