GNU/Linux >> Tutoriels Linux >  >> Linux

trouver et copier toutes les images dans le répertoire à l'aide du terminal linux mint, en essayant de comprendre la syntaxe

Tout d'abord, comprenez que le tuyau "|" lie les commandes redirigeant la sortie de la première vers la seconde en tant qu'argument. Vos deux codes shell dirigent tous les deux la sortie de la commande find vers d'autres commandes (grep et xargs). Examinons ces commandes l'une après l'autre :

Première commande :rechercher

find est un programme pour "rechercher des fichiers dans une hiérarchie de répertoires" (c'est l'explication de la page de manuel de find). La syntaxe est (dans ce cas)

find <search directory> <search pattern> <action>

Dans les deux cas, le répertoire de recherche est . (c'est le répertoire courant). Notez qu'il ne recherche pas seulement le répertoire courant mais également tous ses sous-répertoires (la hiérarchie des répertoires).

Le modèle de recherche accepte les options -name (ce qui signifie qu'il recherche les fichiers dont le nom correspond au modèle donné en argument de cette option) ou -iname (identique au nom mais insensible à la casse) entre autres.

Le modèle d'action peut être -print0 (imprime le nom de fichier exact, y compris sa position dans le répertoire de recherche donné, c'est-à-dire le chemin relatif ou absolu vers le fichier) ou -exec (exécute la commande donnée sur le(s) fichier(s), la commande est de se termine par ";" et chaque instance de "{}" est remplacée par le nom de fichier).

C'est-à-dire le premier code shell (première partie, à gauche du tube)

find . -iname \*.jpg -print0 

recherche tous les fichiers avec la terminaison ".jpg" dans la hiérarchie de répertoires actuelle et imprime leurs chemins et noms. La deuxième (première partie)

find . -name '*' -exec file {} \; 

trouve tous les fichiers dans la hiérarchie de répertoires actuelle et exécute

file <filename>

sur eux. File est une autre commande qui détermine et imprime le type de fichier (consultez la page man pour plus de détails, man file).

Deuxième commande :xargs

xargs est une commande qui "construit et exécute des lignes de commande à partir de l'entrée standard" (man xargs), c'est-à-dire à partir de la sortie de recherche qui est redirigée vers xargs. La commande qu'il construit et exécute est dans ce cas

cp -v {} /home/joachim/neu2"

L'option -I{} définit la chaîne de remplacement, c'est-à-dire que chaque instance de {} dans la commande doit être remplacée par l'entrée qu'elle obtient du fichier (c'est-à-dire les noms de fichiers). L'option -0 définit que les éléments d'entrée ne sont pas terminés (séparés) par des espaces ou des retours à la ligne, mais uniquement par un caractère nul. Cela semble être nécessaire lors de l'utilisation et de la manière standard de traiter la sortie de recherche en tant qu'entrée xargs.

La commande qui est construite et exécutée est alors bien sûr la commande de copie avec l'option -v (verbose) et elle copie chacun des noms de fichiers qu'elle obtient de find vers le répertoire.

Troisième commande :grep

grep filtre son entrée en ne donnant que les lignes ou les chaînes qui correspondent à un modèle de sortie particulier. L'option -o indique à grep d'imprimer uniquement la chaîne correspondante, pas la ligne entière (voir man grep), -P lui indique d'interpréter le modèle suivant comme un modèle d'expression régulière perl. En perl regex, ^ est le début de la ligne, .+ est n'importe quelle chaîne arbitraire, cet arbitraire doit alors être suivi de deux-points, d'un espace, d'un certain nombre de caractères alphanumériques (en perl regex notée \w+) un espace et la chaîne "image". Essentiellement, cette commande grep filtre la sortie du fichier pour n'afficher que les noms de fichiers qui sont des fichiers image. (En savoir plus sur les regex perl par exemple ici :http://www.comp.leeds.ac.uk/Perl/matching.html )

La commande que vous souhaitiez réellement

Maintenant, ce que vous voulez faire est (1) prendre la sortie de la deuxième commande shell (qui répertorie les fichiers image), (2) la mettre sous la forme appropriée et (3) la diriger dans la commande xargs à partir de la première commande shell ligne (qui construit et exécute ensuite la commande de copie souhaitée). Donc, cette fois, nous avons une commande shell à trois (en fait quatre) étapes avec deux canaux. Pas de problème. Nous avons déjà les étapes (1) et (3) (bien qu'à l'étape (3), nous devions omettre l'option -0 car l'entrée ne trouve plus la sortie ; nous en avons besoin pour traiter les retours à la ligne comme des séparateurs d'éléments).

L'étape (2) est toujours manquante. Je suggère d'utiliser la commande cut pour cela. cut modifie les chaînes en les divisant en différents champs (séparés par un caractère délimiteur dans la chaîne d'origine) qui peuvent ensuite être réorganisés. Je vais choisir ":" comme caractère délimiteur (cela termine le nom du fichier dans la sortie de grep, option -d':') et lui dire de nous donner juste le premier champ (option -f1, essentialls :n'imprime que le nom du fichier, pas la partie qui vient après le ":"), c'est-à-dire l'étape (2) serait alors

cut -d':' -f1

Et la commande entière que vous vouliez sera alors :

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2

Notez que vous pouvez trouver toutes les pages de manuel par exemple ici :http://www.linuxmanpages.com


Linux
  1. Linux Trouver et supprimer tous les liens symboliques relatifs à un répertoire ?

  2. rechercher et copier un fichier à l'aide de Bash

  3. rechercher et supprimer des fichiers avec de l'espace à l'aide de la commande find sous Linux

  4. Trouver un répertoire dans un terminal Linux

  5. À l'aide de la commande cp dans le shell Linux, comment copier un répertoire entier dans un autre répertoire ?

Tout sur les fichiers tar et comment tar, décompresser des fichiers sous Linux à l'aide du terminal

Comment trouver un mot de passe WiFi enregistré dans Linux Mint à l'aide d'une interface graphique ou d'un terminal

Tutoriel sur l'utilisation de la dernière commande dans le terminal Linux

50 exemples simples et utiles de la commande Find sous Linux

La commande Linux find Directory :Explication

Utilisation de cut sur Linux Terminal