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 couru 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 listant uniquement les fichiers texte contenant 'LINUX / UNIX'.
Comment puis-je copier ces fichiers finaux (c'est-à-dire les fichiers texte qui contiennent 'LINUX / UNIX') vers un chemin spécifique de votre choix?
J'ai essayé de postuler xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Mais ça n'a pas marché
Réponses:
Essayer:
Étant donné que cette commande utilise la séparation NUL, elle est sûre pour tous les noms de fichiers, y compris ceux avec des noms difficiles 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:Comment ça fonctionne:
grep
options et arguments-r
indique à grep de rechercher récursivement dans la structure du répertoire. (Sur FreeBSD,-r
suivra les liens symboliques dans les répertoires. Cela 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 ceux cachés comme.foo.txt
ou.txt
).-l
indique à 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 prise en charge pargrep
sous GNU / Linux , MacOS et FreeBSD , mais pas OpenBSD .)LINUX/UNIX
indique à grep de ne rechercher que les fichiers dont le contenu inclut l'expression régulièreLINUX/UNIX
.
rechercher dans le répertoire courant. Vous pouvez l'omettre dans les versions récentes de GNUgrep
, mais vous devrez ensuite passer un--
terminateur d'option pourcp
vous 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 sauf si au moins un fichier a été trouvé. (Cette option n'est pas nécessaire sur BSD ou OSX et n'est pas compatible avec OSXxargs
.)cp -t /path/to/dest
copie les répertoires dans le répertoire cible. (-t
nécessite GNUcp
.)la source
cp -t
c'est uniquement Linux.--null
et ajouté une version pour BSD / OSX qui n'utilise pascp -t
.grep
n'a pas--null
.--null
.Plus facilement (fonctionnalités POSIX uniquement):
la source
Le liner sh / Bash one suivant est une autre méthode, mais ne fonctionnera que dans le répertoire en cours, et ne récurrera pas:
L'
-l
option grep affichera une liste des fichiers qui sont copiés, bien que vous puissiez les utiliser-q
si vous ne voulez rien voir à l'écran.la source
Je ne sais pas pourquoi la chaîne d'origine n'a pas fonctionné. La commande suivante fonctionne pour moi.
trouver / -nom (nom de fichier *) | grep '(filename.extention)' | xargs cp -t ./
Dans mon cas, filename * est une collection de fichiers de même nom avec différents types de fichiers (txt, zip, etc.). Je fais grep pour trouver uniquement le nom de fichier.txt et le copier dans mon répertoire de destination (qui est actuellement, ./).
la source