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 :
-
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 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.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 pargrep
sous GNU/Linux, MacOS et FreeBSD mais pas OpenBSD.) -
LINUX/UNIX
indique à 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 àcp
pour se prémunir contre les noms de fichiers commençant par-
.
-
-
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 lesxargs
d'OSX .) -
cp -t /path/to/dest
copie les répertoires dans le répertoire cible. (-t
nécessite GNUcp
.)
-