Est-ce que je viens de tout supprimer avec find -exec mv?

26

J'ai essayé de comprendre cela par moi-même. Voici la commande que j'ai utilisée dans le terminal:

find . -name "*.jpg" -exec mv {} pictures \;

Je n'ai pas créé de répertoire nommé images en premier. Ce qui s'est passé, c'est qu'un fichier nommé pictures.gif a été créé. At-il trouvé les fichiers puis les a-t-il écrasés lors de leur déplacement?

Quel est ce fichier pictures.gif qui a été créé à la suite de cette commande?

Les fichiers sont-ils toujours sur le disque quelque part?

jtnewhou
la source
Désolé que cela vous soit arrivé et j'espère que vous pourrez récupérer des trucs. Mystifié par le .gif - serait intéressant de savoir ce qui s'y est passé.
SEngstrom
7
Si vous écrivez le nom d'un répertoire, ajoutez- /y! Toujours! Il ne peut alors s'agir que d'un répertoire.
Courses de légèreté avec Monica
2
Comme le dit la première réponse: arrêtez d'utiliser ce lecteur maintenant et essayez de récupérer les fichiers .jpg supprimés. Pour cela, cependant, je recommanderais plutôt PhotoRec open source et multiplateforme , qui connaît de nombreux formats d'image (Jpg, mais aussi différents fichiers bruts, etc.) et est très complet.
Olivier Dulac

Réponses:

45

Premièrement: arrêtez d'utiliser ce lecteur maintenant . Il est correct de le remonter en lecture seule, assurez-vous simplement de ne plus écrire. Oui, vous avez supprimé les photos. Ils peuvent être récupérables, mais plus vous continuez à utiliser ce lecteur, moins vous avez de chances de récupérer quoi que ce soit.

Votre commande a été exécutée mv pic1.jpg pictures, mv pic2.jpg picturesetc. Chaque invocation de mvécrase le fichier actuellement nommé picturespar une autre image.

Déplacer un fichier (dans le même système de fichiers) signifie le détacher du répertoire qui le contient et le joindre au répertoire cible sous le nouveau nom. Aucune donnée de fichier n'a donc été modifiée ou supprimée par cette commande, seules les entrées de répertoire des images qui ont disparu.

Vous pouvez exécuter un outil qui parcourt l'espace libre de votre système de fichiers et recherche des éléments qui ressemblent à des jpeg. Heureusement, chaque fichier jpeg commence par un en-tête reconnaissable. Les outils qui recherchent le contenu supprimé sont appelés outils de sculpture . Il y en a quelques-uns dans Ubuntu, notamment recoverjpeg , avant tout , testdisk ,… Si les photos sont sur une partition domestique séparée ou sur un disque externe, installez un ou plusieurs de ces packages et dirigez-les vers la partition avec les images supprimées.

Si les photos sont sur votre disque système, vous devez cesser immédiatement d'utiliser votre système. Utilisez un autre ordinateur pour télécharger un CD live ou USB et démarrer à partir de là. Tous les CD live qui incluent testdisk devraient convenir, mais certains sont plus faciles à utiliser que d'autres. System Rescue CD est un bon CD de secours système à usage général. Ubuntu Rescue Remix peut être plus familier pour un utilisateur d'Ubuntu.


Pour référence future, prenez l'habitude d'utiliser, mv -isauf si vous visez à remplacer les fichiers. Vous avez peut-être déjà un alias pour mv, mais cela ne se déclenche que lorsque vous tapez mvdirectement sur la ligne de commande, pas lorsqu'il mvest invoqué par un script ou par la findcommande.

$ : >pictures
$ mv -i foo.jpg pictures
mv: overwrite `pictures'?

De plus, si vous mettez un /après un nom qui est censé être le nom d'un répertoire, vous obtiendrez une erreur si le répertoire n'existe pas, ou s'il existe un fichier de ce nom qui n'est pas un répertoire.

$ : >pictures
$ mv foo.jpg pictures/
mv: cannot move `foo.jpg' to `pictures/': Not a directory
$ rm pictures
$ mv foo.jpg pictures/
mv: cannot move `foo.jpg' to `pictures/': Not a directory

Pour éviter les pièges de find, vous pouvez utiliser à la place la fonction de traversée de répertoire récursive de bash. Vous devez d'abord l'activer avec la commande shopt -s globstar(vous pouvez ajouter cette ligne à votre ~/.bashrc. Ensuite:

mv **/*.jpg pictures/

(Notez que dans bash, **/traverse également les liens symboliques vers les répertoires, et il n'y a aucun moyen de désactiver cela. Si vous voulez une traversée récursive qui ne regarde pas les liens symboliques vers les répertoires, utilisez zsh ou find.)

Gilles 'SO- arrête d'être méchant'
la source
1
Avez-vous omis l' /after picturesdans la deuxième série d'exemples? C'est-à-dire, ne devrait-il pas être mv foo.jpg pictures/(avec le /) dans les deux mvcommandes?
Paddy Landau
@PaddyLandau En effet, c'était un très mauvais échec de copier-coller ou d'édition. Merci pour le rapport.
Gilles 'SO- arrête d'être méchant'
13

J'ai bien peur que vous veniez de perdre toutes vos photos dans ce même fichier. Il est possible de récupérer certains fichiers à l'aide d'outils médico-légaux comme avant tout, mais le taux de réussite diminue plus vous utilisez le support (disque). (pour être précis, plus la partition est longue .)

La prochaine fois, lorsque vous parlerez d'un répertoire, ajoutez-y une barre oblique et ajoutez l' -ioption de demander une confirmation au cas où un fichier existe déjà:

find -name "*.jpg" -exec mv -i {} pictures/ {} \;
Lekensteyn
la source
6
Oui, je dois souligner à nouveau: ENTREZ IMMÉDIATEMENT DANS UN ENVIRONNEMENT DE CD EN DIRECT! Si vous souhaitez récupérer ces fichiers, vous devez cesser d'utiliser le lecteur maintenant. Et si vous devez télécharger et graver une image, faites-le depuis un autre ordinateur. Moins il y a d'activité sur ce disque, plus vos photos ont de chance d'être restaurées.
Oli
Merci pour cela. J'ai d'abord vu votre réponse et j'ai immédiatement débranché la machine et redémarré avec mon disque de secours USB multiboot.
jtnewhou