Supprimer tous les fichiers qui n'ont pas de chaîne cible?

0

Les fichiers récupérés sont stockés dans / myPhotorec.

Le but est de récursivement grep à travers chaque fichier et s'il ne contient PAS la chaîne "44c9ea3abbd24" dans le contenu du fichier (pas le nom du fichier), puis le supprime. La cible était un fichier .py en python et est renommée de manière aléatoire par le nom de récupération du fichier.

Si cela ne peut pas être fait, alors peut-être que le fichier contenant peut être copié dans un répertoire / filtré?

Gatorback
la source
chaîne 44c9ea3abbd24ou mot 44c9ea3abbd24?
cuonglm
Fichiers texte qui doivent être conservés / triés avec la chaîne 44c9ea3abbd24
gatorback
1
La chaîne est-elle dans le contenu du fichier ou dans le nom du fichier ?
Kusalananda
1
@ Kusalananda Merci pour la très bonne question. contenu du fichier.
Gatorback

Réponses:

1
find /myPhotorec -type f ! -exec grep -qF '44c9ea3abbd24' {} ';' -print -delete

Cela permettrait de rechercher tous les fichiers normaux dans ou sous le /myPhotorecrépertoire, de vérifier s'ils contiennent la chaîne donnée (dans le contenu du fichier) et, pour chaque fichier ne contenant pas la chaîne, d'afficher les noms de chemin et de les supprimer.

Si votre findne supporte pas -delete, alors remplacez cette partie par -exec rm {} +.

Si vous souhaitez confirmer manuellement chaque suppression, passez -deleteà -ok rm {} ';'.

Concernant find ... -exec ...: Comprendre l'option -exec de `find`

Kusalananda
la source
@Kusalanananda Il serait utile, d'un point de vue pédagogique, d'ajouter deux extraits de code à l'explication: 1) rechercher les noms de fichiers sans chaîne cible et les insérer dans la commande 2) delete. Les résultats des tests préliminaires de votre solution sont satisfaisants sous OS X.
gatorback
@gatorback Diffuser les résultats de findn'importe quoi n'est généralement pas une bonne idée. Il est évidemment possible d’utiliser le non standard -print0avec findpuis de le canaliser dans xargs -0 rm(où -0est également non standard), mais cela n’a absolument aucun avantage sur l’utilisation, par exemple, de la même manière -exec rm {} +que dans ma réponse.
Kusalananda
Mon erreur, vous n'avez pas utilisé de pipe dans votre solution. J'essaie de disséquer la solution car ma compréhension des commandes find et exec est très basique. La décomposer en fonction de votre façon de penser accélérerait le processus d'apprentissage
gatorback
@gatorback J'ai ajouté une référence à une réponse assez longue que j'ai écrite précédemment sur ce sujet.
Kusalananda
-1

Je suppose juste faire:

rm -rf `find /myPhotorec -name "*" | grep  -v "44c9ea3abbd24"`
Dzango
la source
2
Ceci effectuerait les grepnoms de fichiers sur, pas le contenu des fichiers.
Kusalananda
En outre, il ne supprimerait aucun élément du dossier dont le nom contient 44c9ea3abbd24, et il y aurait des problèmes avec les noms de fichiers contenant des nouvelles lignes intégrées. Voir unix.stackexchange.com/questions/321697/…
Kusalananda