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 :
-
grepoptions et arguments-
-rindique à grep de rechercher de manière récursive dans la structure des répertoires. (Sur FreeBSD,-rsuivra les liens symboliques dans les répertoires. Ce n'est vrai ni pour OS/X ni pour les versions récentes de GNUgrep.) -
--include '*.txt'indique à grep de ne renvoyer que les fichiers dont les noms correspondent au glob*.txt(y compris les cachés comme.foo.txtou.txt). -
-ldit à grep de ne renvoyer que les noms des fichiers correspondants, pas la correspondance elle-même. -
--nullindique à grep d'utiliser des caractères NUL pour séparer les noms de fichiers. (--nullest pris en charge pargrepsous GNU/Linux, MacOS et FreeBSD mais pas OpenBSD.) -
LINUX/UNIXindique à grep de rechercher uniquement les fichiers dont le contenu inclut la regexLINUX/UNIX -
.recherche dans le répertoire courant. Vous pouvez l'omettre dans les versions récentes de GNUgrep, mais vous devrez alors passer un--terminateur d'option àcppour se prémunir contre les noms de fichiers commençant par-.
-
-
xargsoptions et arguments-
-0indique à xargs d'attendre une entrée séparée par NUL. -
-rindique à 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 lesxargsd'OSX .) -
cp -t /path/to/destcopie les répertoires dans le répertoire cible. (-tnécessite GNUcp.)
-