J'essaie d'exécuter une commande similaire à celle ci-dessous dans un script bash. Il doit rechercher dans tous les sous-dossiers de $sourcedir
et copier tous les fichiers d'un certain type au niveau racine de $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
Cela semble être assez proche, sauf que {}
n'est pas passé en tant que $2
de-exec sh -c ...
Je voudrais le faire aussi près que possible de la "bonne façon", avec une tolérance pour les caractères spéciaux dans les noms de fichiers (en particulier les guillemets simples).
Edit: Je vois des gens suggérer d'utiliser xargs
ou de chaîner des arguments. J'avais l'impression que ce n'était acceptable que pour un nombre limité d'arguments. Si j'ai, par exemple, des milliers de fichiers .jpg que j'essaie de copier d'un certain nombre de répertoires de la galerie dans un répertoire de diaporamas géants, les solutions d'enchaînement des arguments fonctionneront-elles toujours?
Edit 2: Mon problème était qu'il me manquait un _
avant ma première option pour sh dans la -exec
commande. Pour toute personne curieuse de savoir comment faire fonctionner la commande find, ajoutez le _
et tout ira bien:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
J'ai accepté une réponse ci-dessous, car elle accomplit la même tâche, mais est plus efficace et élégante.
xargs
a été créé, pour gérer automatiquement d'énormes quantités d'arguments sur des commandes régulières qui avaient des limites. De plus, la plupart des limites maximales d'arguments ont été considérablement améliorées pour les utilitaires GNU standard. Vous verrez également un avantage en termes de performances, en évitant toutes ces fourchettes de processus, qui sont pertinentes sur des milliers de fichiers.