GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisation à la fois du nom de base et du chemin complet dans find -exec

essayez quelque chose comme ça :

find  /home/mine -iname "*.png" -printf "%P\n " | xargs  -I % -n1 cp %  /home/mine/pngcoppies/copy% 

Pour voir ce qui se passe lorsque vous exécutez la recherche, tapez simplement set -xv
-x :Affiche les commandes et leurs arguments au fur et à mesure de leur exécution.
-v :imprime les lignes d'entrée du shell au fur et à mesure qu'elles sont lues.

Voici ce que j'ai :

find . -name "*.xml" -exec echo {} \;

Donne la sortie :

./log.xml
./svnLog.xml

Et quand j'essaye :

set -xv
find . -name "*.xml" -exec echo {} \;

J'obtiens :

find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml

Et puis find execute echo en passant le nom de fichier trouvé au lieu du littéral :'{}'

mais quand vous ajoutez quelque chose au {} comme ci-dessous :

find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}

Ici l'écho est exécuté deux fois pour les 2 fichiers xml que j'ai et puisqu'il n'y a plus de '{}' est la liste des paramètres de l'exec, elle ne sera pas remplacée. donc nous avons le echo 'something{}' pour chaque fichier trouvé.

Pour faire face à cela, vous pouvez penser à exécuter echo en lui passant le nom du fichier en paramètre comme par exemple :

sh -xvc 'echo sothing/$0' filename

Nous savons déjà ce que vaut -x et -v . -c est d'obtenir la commande à partir de la chaîne qui la suit (man sh )

donc le résultat est :

sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename

J'ai utilisé 'echo somthing/$0 ' entre ' ' pour que $0 ne soit pas développé par le shell actuel. essayez avec " " et vous verrez l'expansion de $0;)

Donc, pour revenir à votre "problème", la recherche doit être formatée comme ci-dessous :

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;

Et nous obtiendrons :

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml

Comme nous pouvons le voir, le find va exécuter le shell cammand echo sothing/$0 en lui passant '{}' (remplacé par le nom du fichier trouvé par find) on obtient donc le echo sothing/./log.xml souhaité

set +xv pour supprimer le mode verbeux, on obtient :

find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml

donc dans votre cas, il vous suffit d'exécuter la copie dans un sous shell (ajoutez sh ou bash ou votre shell préféré après l'exec) et laissez find passez le nom du fichier en parapet au dessus;)

find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;

J'espère que cela pourra vous aider et excusez-moi pour mon anglais.


De man find:"Le primaire -execdir est identique au primaire -exec à l'exception que l'utilitaire sera exécuté à partir du répertoire contenant le fichier en cours. Le nom de fichier substitué à la chaîne ``{}'' n'est pas qualifié."

find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;

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

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

  3. Comment utiliser / (séparateur de répertoire) sous Linux et Windows en Python ?

  4. Lister le fichier à l'aide de la commande ls sous Linux avec le chemin complet

  5. Suppression de fichiers avec rm en utilisant find et xargs

Rechercher et remplacer du texte dans un fichier entre une plage de lignes à l'aide de sed

Systemd :Utiliser à la fois After et Requires

Utiliser find et tar avec des fichiers avec des caractères spéciaux dans le nom

Quel système de fichiers utiliser lorsque vous utilisez à la fois Windows et Linux ?

Comment puis-je rechercher un fichier par son nom et son chemin partiel ?

Comment trouver les arguments complets du processus et les ports d'écoute associés ?