GNU/Linux >> Tutoriels Linux >  >> Linux

Grep Word dans un fichier puis copier le fichier ?

J'ai une collection de fichiers ( *.zip, *.txt, *.tar.gz, *.doc, …etc ). Ces fichiers résident dans un chemin. Je veux trouver tous les fichiers (*.txt), puis copier uniquement les fichiers texte contenant des mots spécifiques (par exemple LINUX/UNIX).

J'ai exécuté ce qui suit :

find . -name "*.txt" | grep 'LINUX/UNIX'

Cette commande a pu trouver tous les fichiers texte, puis "grep" a filtré les fichiers texte résultants en ne répertoriant que les fichiers texte contenant "LINUX/UNIX".

Comment puis-je copier ces fichiers finaux (c'est-à-dire les fichiers texte contenant "LINUX/UNIX") dans un chemin spécifique de mon choix ?

J'ai essayé d'appliquer xargs

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>

Mais ça n'a pas marché

Réponse acceptée :

Essayez :

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest

Étant donné que cette commande utilise la séparation NUL, elle est sûre pour tous les noms de fichiers, y compris ceux dont les noms sont difficiles et qui incluent des espaces, des tabulations ou même des retours à la ligne.

Ce qui précède nécessite GNU cp . Pour MacOS/FreeBSD, essayez :

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "[email protected]" /path/to/dest' sh

Comment ça marche :

  1. grep options et arguments

    • -r indique à grep de rechercher de manière récursive dans la structure des répertoires. (Sur FreeBSD, -r suivra les liens symboliques dans les répertoires. Ce n'est vrai ni pour OS/X ni pour les versions récentes de GNU grep .)

    • --include '*.txt' indique à grep de ne renvoyer que les fichiers dont les noms correspondent au glob *.txt (y compris les cachés comme .foo.txt ou .txt ).

    • -l dit à grep de ne renvoyer que les noms des fichiers correspondants, pas la correspondance elle-même.

    • --null indique à grep d'utiliser des caractères NUL pour séparer les noms de fichiers. (--null est pris en charge par grep sous GNU/Linux, MacOS et FreeBSD mais pas OpenBSD.)

    • LINUX/UNIX indique à grep de rechercher uniquement les fichiers dont le contenu inclut la regex LINUX/UNIX

    • . recherche dans le répertoire courant. Vous pouvez l'omettre dans les versions récentes de GNU grep , mais vous devrez alors passer un -- terminateur d'option à cp pour se prémunir contre les noms de fichiers commençant par - .

  2. xargs options et arguments

    • -0 indique à xargs d'attendre une entrée séparée par NUL.

    • -r indique à xargs de ne pas exécuter la commande à moins qu'au moins un fichier n'ait été trouvé. (Cette option n'est pas nécessaire sur BSD ou OSX et n'est pas compatible avec les xargs d'OSX .)

    • cp -t /path/to/dest copie les répertoires dans le répertoire cible. (-t nécessite GNU cp .)


Linux
  1. Copier des fichiers dans le terminal Linux

  2. Déplacer des fichiers dans le terminal Linux

  3. Guide Ansible :Gérer les fichiers à l'aide d'Ansible

  4. Extraire des fichiers dans un fichier exe ?

  5. Les meilleurs outils de transfert de fichiers sur Linux

Comment copier des fichiers et des répertoires sous Linux

Commande Cp sous Linux (Copier des fichiers)

Les 6 meilleures façons d'afficher des fichiers sous Linux

Comment copier des fichiers avec une extension de fichier spécifique de manière récursive

Comment copier des fichiers et des répertoires dans un terminal Linux

Copier des fichiers en toute sécurité avec la commande SCP