Commande Grep pour rechercher des fichiers contenant une chaîne de texte et les déplacer


15

Je peux localiser des fichiers dans un dossier contenant une chaîne de texte spécifique en utilisant cette commande:

grep -lir 'string' ~/directory/*

Comment déplacer les fichiers qui apparaissent dans le résultat ci-dessus vers un autre emplacement?


C'est ici. grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name
Alan Dong

Réponses:


10

Comme toujours, méfiez-vous grep -r. -rn'est pas une option standard, et dans certaines implémentations comme toutes les versions de GNU grep, mais très récentes , elle suit des liens symboliques lors de la descente de l'arborescence des répertoires, ce qui n'est généralement pas ce que vous voulez et peut avoir de graves conséquences si, par exemple, il y a un lien symbolique vers "/ "quelque part dans l'arborescence des répertoires.

Dans la philosophie Unix, vous utilisez une commande pour rechercher des fichiers dans les répertoires et une autre pour regarder son contenu.

En utilisant des outils GNU, je ferais:

xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
  ) mv -i --target-directory /dest/dir

Mais même alors, méfiez-vous des conditions de concurrence et des problèmes de sécurité possibles si vous l'exécutez en tant qu'utilisateur unique sur un répertoire accessible en écriture par un autre utilisateur.


cela me donne une erreur de recherche: «grep» terminé par le signal 13. une idée qui ne va pas?
Reena Parekh

@ReenaParekh, ce serait un SIGPIPE. Cela ne se produirait que si vous xargssortiez avant de lire jusqu'à la fin de son fichier arg, ce qui ne devrait pas se produire à moins que xargs ne soit tué lui-même ou échoue pour une raison quelconque, auquel cas je m'attends à ce que vous voyiez également une erreur à ce sujet.
Stéphane Chazelas

15

Utilisez xargsde concert avec mvla troisième syntaxe de:mv [OPTION]... -t DIRECTORY SOURCE...

grep -lir 'string' ~/directory/* | xargs mv -t DEST

Faites attention aux fichiers contenant des caractères spéciaux (espaces, guillemets). Si tel est votre cas, filtrer la liste avec sed(en ajoutant des guillemets autour des noms de fichiers avec s/^/'/;s/$/'/) pourrait aider, mais vous devez être sûr que ces guillemets n'apparaîtront pas dans les noms de fichiers. GNOUgrep a l' option -Z/ --nullpour mettre fin aux noms de fichiers NUL.

Une alternative à la troisième syntaxe pour mvest d'utiliser xargsavec la chaîne d'espace réservé ( -I).

Une autre option est la substitution de commandes - $( )ou les retours ``en arrière (en bash) comme mentionné dans la réponse de ire_and_curses.


3
gnu grep prend en charge un indicateur -Z pour séparer les noms de fichiers par le caractère zéro octet, qui, lorsqu'il est utilisé conjointement avec l'indicateur -0 à xargs, peut contourner le problème de caractères spéciaux que vous mentionnez
iruvar

@ChandraRavoori merci, j'ai mis à jour la réponse.
peterph


2

Utiliser uniquement les fonctionnalités spécifiées par POSIX et ne faire aucune hypothèse sur les noms de fichiers:

find ~/directory -type f -exec grep -qiF 'string' {} \; -exec mv {} /path/to/dest \;

Remarques:

Vous avez dit "chaîne" et non "motif", donc l' -Foption (recherche de chaîne fixe) grepsemble appropriée.

Si votre répertoire de destination se trouve n'importe où dans votre répertoire de recherche, vous pouvez avoir des conditions de course désagréables.

Spécifications POSIX pour grep

Spécifications POSIX pour find


Cela pourrait être la meilleure solution sur Macos / BSD
Ali

0

Utilisation de GNU parallel :

grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'

ht / @ lin-dong pour sa réponse originale avec xargs.


Cela aurait été bien si vous aviez crédité la réponse de @ lindong dans les commentaires d'il y a plus d'un an.
roaima du

0

-Supposez que vous avez le répertoire de destination comme «externe» et que vous devez déplacer tous les fichiers XLS, vous pouvez essayer la commande ci-dessous

sudo mv find /var/log/ -type f -name "*.xls"/ externe /

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.